Powershell Out-File не работает для CSV



У меня есть следующий код:



$databaseContents = "col1,col2,col3,col4"
$theDatabaseFile = "C:NewFolderDatabase.csv
$databaseContents | Out-File $theDatabaseFile


Однако, когда я открываю файл csv в Excel, он имеет col1, col2, col3, col4 в ячейке A1, а не col1 в ячейке A1, col2 в ячейке B1 и т. д.



Я заметил кое-что странное.:
Если я открою файл в блокноте и скопирую текст в другой экземпляр блокнота и сохраню его как Database1.csv, затем откройте его в Excel, он отображается, как и ожидалось.



Как я могу получить командлет Out-File, чтобы сохранить его как a .csv файл с содержимым в 4 столбцах как ожидали?



Править:
Я заметил, что если я использую Set-Content вместо Out-File, то csv-файл будет правильно отображаться в Excel.
Кто-нибудь знает, почему это происходит?

530   3  

3 ответов:

Почему это имеет значение для Excel, мне неясно, но это сводится к кодировке результирующего выходного файла-Unicode (в случаях, которые не работают) против ASCII (в случаях, которые делают).

PowerShell Out-File vs Set-Content в файле CSV

Альтернативный подход@JPBlanc работает, потому что он устанавливает кодировку выходного файла в ASCII, где ваш исходный пример (неявно) устанавливает кодировку выходного файла в Unicode.

Простое добавление -Encoding ascii к вашему исходному примеру тоже отлично работает:

$databaseContents = "col1,col2,col3,col4"
$theDatabaseFile = "C:\NewFolder\Database.csv
$databaseContents | Out-File $theDatabaseFile -Encoding ascii

И добавление явного -Encoding unicode в исходный пример приводит к тому же нарушенному результату, с которым вы столкнулись:

$databaseContents = "col1,col2,col3,col4"
$theDatabaseFile = "C:\NewFolder\Database.csv
$databaseContents | Out-File $theDatabaseFile -Encoding unicode

Это в основном то, что было неявно происходит.

Это также работает:

$databaseContents = "col1;col2;col3;col4"
$theDatabaseFile = "C:\temp\Database.csv"
$databaseContents | Out-File $theDatabaseFile -Encoding ascii

По умолчанию CSV-разделитель в Excel seams должен быть '; ' и Out-File сохранить как unicode, заставляя ASCII seams выдавать результат, который вы ищете.

У меня была та же проблема, что и у Backwards_Dave , и так же, как и он, использование команды Set-Content вместо команды Out-File работало для меня:

#Build $temp String
$temp = "$scriptApplication;$applicationName;$type;$description;$maxSessions;$enabled;$tempParams`n"

#Write $temp String to $fichierCsv file
"$temp" | Set-Content $fichierCsv

Я попробовал использовать JPBlanc и j0e3gan решение, но оно не сработало (-Encoding ascii вариант): интересно, почему.

Comments

    Ничего не найдено.