Могу ли я объединить эти CSV-файлы в один CSV-файл большего размера?

Мой старый файл Bat Скопируйте F: \ File.hdr + F: *. Csv F: \ FinalOutput.csv

файл HDR - это файл с одной записью, который содержит только данные заголовка для файлов CSV.

Есть ли способ сделать это в PowerShell (объединить все файлы CSV в один файл)?

Вот мой сценарий PowerShell, который не работает

$CSVFolder = 'F:\Input\';
$OutputFile = 'F:\Output\NewOutput.csv';    
$CSV= @();    
Get-ChildItem -Path $CSVFolder -Filter *.inv | ForEach-Object { 
    $CSV += @(Import-Csv -Path $CSVFolder\$_)
}    
$CSVHeader = Import-Csv 'F:\Input\Headings.hdr'    
$CSV = $CSVHeader + $CSV    
$CSV | Export-Csv -Path $OutputFile -NoTypeInformation -Force;

Я получаю список экспортируемых имен файлов, а не содержимое файлов. Сценарий также изменяет дату и время в моих файлах INV. Так не должно быть.


person software is fun    schedule 13.04.2015    source источник
comment
Может, стоит использовать Get-Content вместо Import-Csv?   -  person arco444    schedule 13.04.2015
comment
Позвольте мне попробовать это вместо этого. Спасибо   -  person software is fun    schedule 13.04.2015
comment
Что ж, я изменил Import-Csv на Get-Content, и он отлично работает, пока я не попытаюсь объединить два $ CSV = $ CSVHeader + $ CSV, и в результате получится длина. Как мне объединить два файла?   -  person software is fun    schedule 13.04.2015
comment
Попробуйте $CSV = $CSVHeader , $CSV   -  person arco444    schedule 13.04.2015


Ответы (2)


Вы можете пропустить весь бит CSV, если просто добавляете файлы, как раньше.

Примерно так должно работать:

# First we create the new file and add the header.
get-content $headerfile | set-content $outputfile

# Then we get the input files, read them out with get-content 
# and append them to the output file (add-content).
get-childitem -path $csvfolder *.inv | get-content | add-content $outputfile

Командлеты CSV удобны, если вы хотите обрабатывать данные CSV в своем скрипте, но в вашем случае простое добавление файлов поможет. Не беспокоиться о преобразовании CSV будет намного быстрее, поскольку Powershell не нужно анализировать строки CSV и создавать PS-объекты. Хотя с чистым текстом это действительно быстро.

Еще одна хитрость заключается в том, как get-content и add-content используются в конвейере. Поскольку они знают о конвейере, вы можете передавать файловые объекты без использования цикла foreach. Это делает ваши заявления намного короче.

person jurgenb    schedule 13.04.2015
comment
Спасибо, это работает. И последнее, о чем я хочу вас спросить. В некоторых файлах первая строка была равна 0 (это недопустимые данные). Можем ли мы начать удалять строки с 0 в нем? - person software is fun; 13.04.2015
comment
как мне не импортировать первую строку из файлов inv? - person software is fun; 13.04.2015
comment
Зависит от того, как именно выглядят неверные данные. Если это ноль, например 0, вы можете использовать where -notlike "0*" для фильтрации данных после оператора get-content (* - это подстановочный знак, соответствующий остальной части строки). Затем это отфильтрует все строки, соответствующие этому шаблону (то есть строки, начинающиеся со строки 0), независимо от того, где они появляются в файле. - person jurgenb; 13.04.2015
comment
get-childitem -path $ csvfolder * .inv | get-content where -notlike 0 | add-content $ outputfile (выдает ошибку) - person software is fun; 13.04.2015
comment
Все будет проще, если вы используете import-csv вместо get-content. - person Bill_Stewart; 13.04.2015

Как насчет:

get-childitem *.inv | foreach-object {
  import-csv $_ -header (get-content Headings.hdr)
} | export-csv NewOutput.csv -notypeinformation
person Bill_Stewart    schedule 13.04.2015
comment
У меня есть один файл, который является файлом HDR (он содержит информацию заголовка и должен быть первой строкой вновь созданного файла. - person software is fun; 13.04.2015
comment
Так что добавьте -header к import-csv. См. Мой измененный ответ. - person Bill_Stewart; 13.04.2015