Export-Csv добавляет нежелательные заголовки двойных кавычек
У меня есть исходный CSV-файл (без заголовка, все столбцы разделены запятой), который я пытаюсь разделить на отдельные CSV-файлы на основе значения в первом столбце и использования этого значения столбца в качестве имени выходного файла.
Входной файл:
S00000009,2016, M04 01/07/2016,0,00,0,00,0,00,0,00,0,00,0,00,750,00,0,00,0,00 S00000009,2016,M05 01/08/2016,0,00,0,00,0,00,0,00,0,00,0,00,600,00,0,00,0,00 S00000009,2016,M06 01.09.2016,0,00,0,00,0,00,0,00,0,00,0,00,600,00,0,00,0,00 S00000010,2015,W28 05/10/2015,2275,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00 S00000010,2015,W41 04.01.2016,0,00,0,00,0,00,0,00,0,00,0,00,568,75,0,00,0,00 S00000010,2015,W42 11.01.2016,0,00,0,00,0,00,0,00,0,00,0,00,568,75,0,00,0,00 S00000012,2015,W10 01/06/2015,0,00,0,00,0,00,0,00,0,00,0,00 650,00,0,00,0,00 S00000012,2015,W11 08/06/2015,0,00,0,00,0,00,0,00,0,00,0,00 650,00,0,00,0,00 S00000012,2015,W12 15/06/2015,0,00,0,00,0,00,0,00,0,00,0,00 650,00,0,00,0,00
Мой скрипт PowerShell выглядит так:
Import-Csv INPUT_FILE.csv -Header service_id,year,period,cash_exp,cash_inc,cash_def,act_exp,act_inc,act_def,comm_exp,comm_inc,comm_def |
Group-Object -Property "service_id" |
Foreach-Object {
$path = $_.Name + ".csv";
$_.group | Export-Csv -Path $path -NoTypeInformation
}
Выходные файлы:
S00000009.csv
:
"Service_id","год", "период","cash_exp","cash_inc","cash_def","act_exp","act_inc","act_def","comm_exp","comm_inc","comm_def" "S00000009","2016","M04 от 01.07.2016", "0,00", "0,00", "0,00", "0,00", "0,00", "0,00","750,00", "0,00", " 0,00" "S00000009","2016","M05 01.08.2016", "0,00", "0,00", "0,00", "0,00", "0,00", "0,00", "600,00", "0,00", " 0,00" "S00000009","2016","M06 01.09.2016", "0,00", "0,00", "0,00", "0,00", "0,00", "0,00", "600,00", "0,00", " 0,00"
S00000010.csv
:
"Service_id","год", "период","cash_exp","cash_inc","cash_def","act_exp","act_inc","act_def","comm_exp","comm_inc","comm_def" "S00000010","2015","W28 05.10.2015","2275.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0,00" "S00000010","2015","W41 от 01.01.2016", "0,00", "0,00", "0,00", "0,00", "0,00", "0,00","568,75","0,00", " 0,00" "S00000010","2015","W42 11.01.2016", "0,00", "0,00", "0,00", "0,00", "0,00", "0,00","568,75","0,00", " 0,00"
Он генерирует новые файлы, используя значение заголовка в столбце 1 (service_id). Есть 2 проблемы.
- Выходной CSV-файл содержит строку заголовка, которая мне не нужна.
- Столбцы заключены в двойные кавычки, которые мне не нужны.
3 ответа
Прежде всего, для файла.csv нужны заголовки и кавычки в виде структуры файла csv. Но если вы не хотите их, то вы можете продолжить с текстовым файлом или...
$temp = Import-Csv INPUT_FILE.csv -Header service_id,year,period,cash_exp,cash_inc,cash_def,act_exp,act_inc,act_def,comm_exp,comm_inc,comm_def | Group-Object -Property "service_id" |
Foreach-Object {
$path=$_.name+".csv"
$temp0 = $_.group | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1
$temp1 = $temp0.replace("""","")
$temp1 > $path
}
Но этот вывод не является "настоящим" CSV-файлом. Надеюсь, это поможет.
Для вашего конкретного сценария вы можете использовать более простой подход. Считайте входной файл как простой текстовый файл, сгруппируйте строки, разделив первое поле, затем запишите группы в выходные файлы, названные в честь групп:
Get-Content 'INPUT_FILE.csv' |
Group-Object { $_.Split(',')[0] } |
ForEach-Object { $_.Group | Set-Content ($_.Name + '.csv') }
Другое решение,
- не используя именованные заголовки, а просто числа (так как они не нужны в любом случае)
- избегая ненужных временных файлов.
- удаление только поля, разделяющего двойные кавычки.
Import-Csv INPUT_FILE.csv -Header (1..12) |
Group-Object -Property "1" | Foreach-Object {
($_.Group | ConvertTo-Csv -NoType | Select-Object -Skip 1).Trim('"') -replace '","',',' |
Set-Content -Path ("{0}.csv" -f $_.Name)
}