Import-Csv / Export-Csv with german umlauts(ä,ö,ü)

时间:2018-02-23 11:46:24

标签: powershell character-encoding import-csv export-csv

在处理包含ä,ö,ü(德语语言变音符号)等变异元音的csv-exports时遇到了一个小问题

我只是用

导出
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都没有成功。

如何在导出和排序时保留特殊字符ä,ö,ü和其他?

1 个答案:

答案 0 :(得分:1)

Mathias R. Jessen在对该问题的评论中提供了关键指针:

Import-Csv来电,而不是Export-Csv,这是您案件中问题的原因:

Export-Csv一样,Import-Csv也需要传递-Encoding Default才能正确处理使用系统的“ANSI”旧版代码页编码的文本文件 ,这是一个8位,单字节字符编码,如Windows-1252。

Windows PowerShell 中,即使通用文本文件处理Get-Content / Set-Content cmdlet对默认到{{1令人遗憾的是,令人遗憾的是DefaultImport-Csv

请注意,在读取时,仅当输入文件具有 no BOM (字节顺序标记,即Unicode签名,一个魔术字节序列)时,才会假定默认编码。开始明确标识文件编码的文件。

Export-CsvImport-Csv不仅默认值与Export-Csv / Get-Content不同,而且单独具有不同的默认值:

  • Set-Content默认为UTF-8
  • Import-Csv默认为ASCII(!),这意味着任何非ASCII字符 - 例如Export-Csväö - 被音译为文字 ü字符,导致数据丢失

相比之下,在 PowerShell Core 中,基于.NET Core构建的跨平台版本,默认编码为(无BOM) UTF-8 ,贯穿所有cmdlet ,这极大地简化了问题,并使您更容易确定何时需要使用?参数。

演示Windows PowerShell -Encoding / Import-Csv行为

Export-Csv - 默认为 UTF-8

Import-Csv

以上产量:

# 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

如你所见,变音符号被正确保存。

相比之下,如果文件被“ANSI”编码(Column1 ------- aäöü ; $str | Set-Content t.csv隐含),则变音符号会被破坏。

-Encoding Default - 默认为 ASCII - 数据丢失风险

基于上面的例子:

Export-Csv

的产率:

Import-Csv .\t.csv | Export-Csv .\t.new.csv
Get-Content .\t.new.csv

如您所见,变音符号被文字问号"Column1" "a???" )取代。