Импорт-CSV / Экспорт-CSV с немецкими умлаутами (ä,ö,ü)
Я столкнулся с небольшой проблемой при работе с csv-export, который содержит мутированные гласные, такие как ä,ö,ü (Umlaute немецкого языка)
я просто экспортирую с
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(s) без успеха.
как я могу сохранить специальные символы ä, ö, ü и другие при экспорте и сортировке?
1 ответ
Mathias R. Jessen дает ключевой указатель в комментарии к вопросу:
Это Import-Csv
позвони, а не Export-Csv
Вот причина проблемы в вашем случае:
подобно Export-Csv
, Import-Csv
тоже нужно сдать -Encoding Default
для правильной обработки текстовых файлов, закодированных активной активной кодовой страницей "ANSI" системы, которая представляет собой 8-битную однобайтовую кодировку символов, например Windows-1252.
В Windows PowerShell, хотя общая обработка текстовых файлов Get-Content
/ Set-Content
пара командлетов по умолчанию Default
кодирование (как следует из названия), к сожалению и удивительно, Import-Csv
а также Export-Csv
не надо
Обратите внимание, что при чтении кодировка по умолчанию предполагается только в том случае, если входной файл не имеет спецификации (метка порядка байтов, также подпись Unicode, магическая последовательность байтов в начале файла, которая однозначно определяет кодировку файла).
Не только делать Import-Csv
а также Export-Csv
имеют значения по умолчанию, которые отличаются от Get-Content
/ Set-Content
они индивидуально имеют разные значения по умолчанию:
Import-Csv
по умолчанию UTF-8.Export-Csv
по умолчанию ASCII (!), что означает, что любые не-ASCII символы, такие какä
,ö
,ü
- транслитерированы до буквального?
chars., что приводит к потере данных.
В отличие от этого, в PowerShell Core, кроссплатформенном выпуске, построенном на.NET Core, кодировка по умолчанию (без спецификации) - UTF-8, последовательно для всех командлетов, что значительно упрощает работу и упрощает определение того, когда вы нужно использовать -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???"
Как видите, умлауты были заменены буквальными вопросительными знаками (?
).