>我在处理包含突变元音(如 ä,ö,ü(德语变音符号))的 csv 导出时遇到了一个小问题
我只是导出
Get-WinEvent -FilterHashtable @{Path=$_;ID=4627} -ErrorAction SilentlyContinue |export-csv -NoTypeInformation -Encoding Default -Force ("c:tempCSV_temp"+ $_.basename + ".csv")
我在我的 CSV 文件中正确拥有 ä,ö,ü。
之后,我做了一些排序:
Get-ChildItem 'C:temp*.csv' |
ForEach-Object { Import-Csv $_.FullName } |
Sort-Object { [DateTime]::ParseExact($_.TimeCreated, $pattern, $culture) } |
Export-Csv 'C:tempmerged.csv' -Encoding Default -NoTypeInformation -Force
我玩了所有的编码,ASCII,BigEndianUnicode,UniCode,但没有成功。
导出和排序时如何保留特殊字符 Ä、Ö、ü 和其他字符?
Mathias R. Jessen在对这个问题的评论中提供了关键的指示:
这是Import-Csv
调用,而不是Export-Csv
,这是您情况下问题的原因:
与Export-Csv
一样,Import-Csv
也需要传递-Encoding Default
,以便正确处理使用系统的活动"ANSI"旧代码页编码的文本文件,该代码页是8位,单字节字符编码,如Windows-1252。
在Windows PowerShell中,尽管通用文本文件处理Get-Content
/Set-Content
cmdlet 对默认为Default
编码(顾名思义),但遗憾的是,Import-Csv
和Export-Csv
没有。
请注意,在读取时,仅当输入文件没有 BOM(字节顺序标记,又名 Unicode 签名,文件开头的魔术字节序列,明确标识文件的编码)时,才会假定默认编码。
Import-Csv
和Export-Csv
不仅具有与Get-Content
/Set-Content
不同的默认值,它们各自具有不同的默认值:
Import-Csv
默认为 UTF-8。- !),这意味着任何非 ASCII 字符(如
ä
、ö
ü
)都会音译为文字?
字符,从而导致数据丢失。
Export-Csv
默认为 ASCII(相比之下,在PowerShellCore(基于 .NET Core 构建的跨平台版本)中,默认编码是(无 BOM)UTF-8,在所有 cmdlet 中始终如一,这大大简化了问题,并且更容易确定何时需要使用-Encoding
参数。
Windows PowerShellImport-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"编码的($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???"
如您所见,变音符号被字面问号(?
) 取代。