首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Import-Csv / Export-Csv (带德语元音(ä,ö,ü) )

Import-Csv / Export-Csv (带德语元音(ä,ö,ü) )
EN

Stack Overflow用户
提问于 2018-02-23 19:46:24
回答 1查看 12.7K关注 0票数 7

我在处理csv-exports时遇到了一个小问题,它包含了一些变异的元音,比如ä,ö,ü(德语Umlaute)

我只是用以下命令导出

代码语言:javascript
复制
Get-WinEvent -FilterHashtable @{Path=$_;ID=4627} -ErrorAction SilentlyContinue |export-csv -NoTypeInformation -Encoding Default -Force ("c:\temp\CSV_temp\"+ $_.basename + ".csv")

它工作得很好。我的csv文件中的ä、ö、ü是正确的。

在那之后,我做了一些排序:

代码语言:javascript
复制
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)都没有成功。

如何在导出和排序时保留特殊字符ä、ö、ü等?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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-CsvExport-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

代码语言:javascript
复制
# 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

以上结果如下:

代码语言:javascript
复制
Column1
-------
aäöü

如你所见,变音被正确地保留了下来。

相反,如果文件是"ANSI"-encoded ($str | Set-Content t.csv-Encoding Default暗示),那么变音就会被破坏。

Export-Csv -默认值为ASCII -数据丢失风险

以上面的例子为基础:

代码语言:javascript
复制
Import-Csv .\t.csv | Export-Csv .\t.new.csv
Get-Content .\t.new.csv

收益率:

代码语言:javascript
复制
"Column1"
"a???"

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48947151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档