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 проблемы.

  1. Выходной CSV-файл содержит строку заголовка, которая мне не нужна.
  2. Столбцы заключены в двойные кавычки, которые мне не нужны.

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) 
}
Другие вопросы по тегам