带有德语变音符 (ä,ö,ü) 的 Import-Csv / Export-Csv
Import-Csv / Export-Csv with german umlauts (ä,ö,ü)
我在处理包含 ä,ö,ü(德语元音变音)等变异元音的 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,但都没有成功。
如何在导出和排序时保留特殊字符 ä、ö、ü 和其他字符?
Mathias R. Jessen 在对问题的评论中提供了关键指针:
这是 Import-Csv
调用,而不是 Export-Csv
,这就是您的问题的原因:
与 Export-Csv
一样,Import-Csv
也需要传递 -Encoding Default
以便正确处理使用系统的活动 "ANSI" 遗留编码的文本文件code page,这是一个 8 位的 single-byte 字符编码,例如 Windows-1252.
在 Windows PowerShell 中,即使通用 text-file 处理 Get-Content
/ Set-Content
cmdlet将 defaults 与 Default
编码配对(顾名思义),令人遗憾且令人惊讶的是,Import-Csv
和 Export-Csv
做 not.
请注意,在阅读时,只有当输入文件没有BOM(byte-order标记, a.k.a Unicode 签名,文件开头的神奇字节序列,明确标识文件的编码)。
不仅 Import-Csv
和 Export-Csv
的默认值与 Get-Content
/ Set-Content
不同,它们 各自 也有不同的默认值默认值:
Import-Csv
默认为UTF-8.
Export-Csv
默认为 ASCII(!),这意味着任何 non-ASCII 字符 - 例如 ä
、ö
, ü
- 被音译为 文字 ?
个字符,导致 数据丢失 .
相比之下,在 PowerShell Core 中,cross-platform 版本基于 .NET Core,默认编码是 (BOM-less) UTF-8,在所有 cmdlets 中始终如一 ,这大大简化了事情并使您更容易确定何时执行需要使用 -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" 编码($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???"
如您所见,变音符号已替换为 文字问号 (?
)。
我在处理包含 ä,ö,ü(德语元音变音)等变异元音的 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,但都没有成功。
如何在导出和排序时保留特殊字符 ä、ö、ü 和其他字符?
Mathias R. Jessen 在对问题的评论中提供了关键指针:
这是 Import-Csv
调用,而不是 Export-Csv
,这就是您的问题的原因:
与 Export-Csv
一样,Import-Csv
也需要传递 -Encoding Default
以便正确处理使用系统的活动 "ANSI" 遗留编码的文本文件code page,这是一个 8 位的 single-byte 字符编码,例如 Windows-1252.
在 Windows PowerShell 中,即使通用 text-file 处理 Get-Content
/ Set-Content
cmdlet将 defaults 与 Default
编码配对(顾名思义),令人遗憾且令人惊讶的是,Import-Csv
和 Export-Csv
做 not.
请注意,在阅读时,只有当输入文件没有BOM(byte-order标记, a.k.a Unicode 签名,文件开头的神奇字节序列,明确标识文件的编码)。
不仅 Import-Csv
和 Export-Csv
的默认值与 Get-Content
/ Set-Content
不同,它们 各自 也有不同的默认值默认值:
Import-Csv
默认为UTF-8.Export-Csv
默认为 ASCII(!),这意味着任何 non-ASCII 字符 - 例如ä
、ö
,ü
- 被音译为 文字?
个字符,导致 数据丢失 .
相比之下,在 PowerShell Core 中,cross-platform 版本基于 .NET Core,默认编码是 (BOM-less) UTF-8,在所有 cmdlets 中始终如一 ,这大大简化了事情并使您更容易确定何时执行需要使用 -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" 编码($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???"
如您所见,变音符号已替换为 文字问号 (?
)。