Импорт-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???"

Как видите, умлауты были заменены буквальными вопросительными знаками (?).

Другие вопросы по тегам