我在处理csv-exports时遇到了一个小问题,它包含了一些变异的元音,比如ä,ö,ü(德语Umlaute)
我只是用以下命令导出
Get-WinEvent -FilterHashtable @{Path=$_;ID=4627} -ErrorAction SilentlyContinue |export-csv -NoTypeInformation -Encoding Default -Force ("c:\temp\CSV_temp\"+ $_.basename + ".csv")它工作得很好。我的csv文件中的ä、ö、ü是正确的。
在那之后,我做了一些排序:
Get-ChildItem 'C:\temp\*.csv' |
ForEach-Object { Import-Csv $_.FullName } |
Sort-Object { [DateTime]::ParseExact($_.TimeCreated, $pattern, $culture) } |
Export-Csv 'C:\temp\merged.csv' -Encoding Default -NoTypeInformation -Force我尝试了所有的编码,ASCII,BigEndianUnicode,UniCode(s)都没有成功。
如何在导出和排序时保留特殊字符ä、ö、ü等?
发布于 2018-02-26 02:17:22
Mathias R. Jessen在对这个问题的评论中提供了关键的指针:
在您的案例中,问题的原因是Import-Csv调用,而不是Export-Csv:
像-Encoding Default Export-Csv**,** Import-Csv 这样的也需要传递给,以便正确处理用系统活动的"ANSI“传统代码页编码的文本文件,这是一种8位单字节字符编码,如-1252。
在 Windows PowerShell中,尽管通用文本文件处理Export-Csv not. /PowerShell对E233 E233和E134默认E235 E236 E136编码(顾名思义)到E237 E237 E141编码(顾名思义),但遗憾的是,也令人惊讶的是,E242 E242 E146<代码>和E247 E151Export-CsvE252not.
请注意,在读取时,仅当输入文件没有BOM (字节顺序标记,也称为Unicode签名,位于文件开头的魔术字节序列,明确标识文件的编码)时,才假定使用默认编码。
Import-Csv和Export-Csv不仅具有与Get-Content / Set-Content不同的默认值,而且它们各自具有不同的默认值:
Import-Csv 默认为UTF-8.Export-Csv 默认为ASCII(!),这意味着任何非ASCII字符-such为ä、ö、ü -都会音译为文字?字符,从而导致数据丢失。相比之下,在PowerShell核心(基于.NET核心构建的跨平台版本)中,的默认编码是跨所有cmdlet一致的(无物料清单),这极大地简化了问题,并使您更容易确定何时需要使用-Encoding参数。
Windows PowerShell Import-Csv / Export-Csv行为演示
Import-Csv -默认为UTF-8
# Sample CSV content.
$str = @'
Column1
aäöü
'@
# Write sample CSV file 't.csv' using UTF-8 encoding *without a BOM*
# (Note that this cannot be done with standard PowerShell cmdlets.)
$null = new-item -type file t.csv -Force
[io.file]::WriteAllLines((Convert-Path t.csv), $str)
# Use Import-Csv to read the file, which correctly preserves the UTF-8-encoded
# umlauts
Import-Csv .\t.csv以上结果如下:
Column1
-------
aäöü如你所见,变音被正确地保留了下来。
相反,如果文件是"ANSI"-encoded ($str | Set-Content t.csv;-Encoding Default暗示),那么变音就会被破坏。
Export-Csv -默认值为ASCII -数据丢失风险
以上面的例子为基础:
Import-Csv .\t.csv | Export-Csv .\t.new.csv
Get-Content .\t.new.csv收益率:
"Column1"
"a???"如您所见,变音符号被文字问号(?)所取代。
https://stackoverflow.com/questions/48947151
复制相似问题