Pet*_*ore 6 powershell character-encoding import-csv export-csv
我在处理 csv 导出时遇到了一个小问题,其中包含像 ä,ö,ü(德语元音变音)这样的变异元音
我只是导出
Get-WinEvent -FilterHashtable @{Path=$_;ID=4627} -ErrorAction SilentlyContinue |export-csv -NoTypeInformation -Encoding Default -Force ("c:\temp\CSV_temp\"+ $_.basename + ".csv")
Run Code Online (Sandbox Code Playgroud)
这工作正常。我的 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
Run Code Online (Sandbox Code Playgroud)
我尝试了所有编码、ASCII、BigEndianUnicode、UniCode,但都没有成功。
导出和排序时如何保留特殊字符 ä,ö,ü 等?
Mathias R. Jessen在对该问题的评论中提供了关键点:
\n\n在您的情况下,问题的原因是调用,而不是Import-Csv:Export-Csv
与 一样Export-Csv,Import-Csv也需要传递-Encoding Default才能正确处理使用系统的活动“ANSI”旧代码页编码的文本文件,这是一种 8 位、单字节字符编码,例如 Windows-1252。
在Windows PowerShell中,尽管通用文本文件处理Get-Content/ Set-Contentcmdlet对默认为Default编码(顾名思义),但遗憾且令人惊讶的是,Import-Csv事实Export-Csv并非如此。
请注意,读取时仅在输入文件没有BOM(字节顺序标记,又名 Unicode 签名,文件开头的魔术字节序列,明确标识文件的编码)时才假定默认编码。
\n\n不仅 和Import-Csv的默认值与/Export-Csv不同,而且它们各自具有不同的默认值:Get-ContentSet-Content
Import-Csv默认为 UTF-8。Export-Csv默认为 ASCII(!),这意味着任何非 ASCII 字符 - 例如\xc3\xa4, \xc3\xb6, \xc3\xbc- 都会被音译为文字 ?字符,从而导致数据丢失。相比之下,在PowerShell Core(基于 .NET Core 构建的跨平台版本)中,默认编码是(无 BOM)UTF-8,在所有 cmdlet 中一致,这大大简化了问题,并且更容易确定何时确实需要使用该-Encoding参数。
Import-CsvWindows PowerShell /Export-Csv行为演示Import-Csv- 默认为UTF-8:
# Sample CSV content.\n$str = @\'\nColumn1\na\xc3\xa4\xc3\xb6\xc3\xbc\n\'@\n\n# Write sample CSV file \'t.csv\' using UTF-8 encoding *without a BOM*\n# (Note that this cannot be done with standard PowerShell cmdlets.)\n$null = new-item -type file t.csv -Force\n[io.file]::WriteAllLines((Convert-Path t.csv), $str)\n\n# Use Import-Csv to read the file, which correctly preserves the UTF-8-encoded\n# umlauts\nImport-Csv .\\t.csv\nRun Code Online (Sandbox Code Playgroud)\n\n上面的结果是:
\n\nColumn1\n-------\na\xc3\xa4\xc3\xb6\xc3\xbc\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,变音符号被正确保留。
\n\n相比之下,如果文件是“ANSI”编码的($str | Set-Content t.csv;-Encoding Default隐含的),变音符号就会被损坏。
Export-Csv- 默认为ASCII - 数据丢失的风险:
基于上面的例子:
\n\nImport-Csv .\\t.csv | Export-Csv .\\t.new.csv\nGet-Content .\\t.new.csv\nRun Code Online (Sandbox Code Playgroud)\n\n产量:
\n\n"Column1"\n"a???"\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,元音变音被替换为字面问号( ?)。