Конкатенация CSV-файлов в PowerShell без первой строки (кроме первого файла) - PullRequest
1 голос
/ 11 февраля 2020

У меня есть несколько * .csv файлов. Я хочу объединить их в один файл CSV в сценарии powershell. Все CSV-файлы имеют одинаковый заголовок (первая строка), поэтому, когда я объединяю их, я хочу сохранить первую строку только из первого файла.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Вы могли бы сделать так:

(Get-ChildItem -Path $path -Filter *.csv).FullName | Import-Csv | Export-Csv $path\concatenated.csv -NoTypeInformation

Где $path - это папка, в которой существуют файлы csv. Окончательный CSV-файл будет находиться в той же папке.

1 голос
/ 11 февраля 2020

Примечание. В решении в этом ответе специально используется обработка простого текста для обработки файлов по двум причинам:

  • Использование Import-Csv и Export-Csv влечет за собой значительные накладные расходы на обработку (хотя это может не иметь значения в данной ситуации); Обработка простого текста значительно быстрее .

  • В Windows PowerShell и PowerShell [Core] 6.x выходные данные всегда будут иметь двойные кавычки значения столбцов , даже если они не были изначально (хотя это обычно не имеет значения).

    • В PowerShell [Core] 7.0+ Export-Csv и ConvertTo-Csv теперь имеет параметр -UseQuotes, который позволяет вам управлять цитированием в выходных данных.

При этом Import-Csv и Export-Csv, безусловно, лучший выбор, когда вам нужно читать и интерпретировать данные (в отличие от простого копирования в другом месте) - см. полезный ответ Сида .


# The single output file.
# Note: Best to save this in a different folder than the input
#       folder, in case you need to run multiple times.
$outFile = 'outdir/out.csv'

# Get all input CSV files as an array of file-info objects,
# from the current dir. in this example
$inFiles = @(Get-ChildItem -Filter *.csv)

# Extract the header line (column names) from the first input file
# and write it to the output file.
Get-Content $inFiles[0] -First 1 | Set-Content -Encoding Utf8 $outFile

# Process all input files and append their *data* rows to the
# output file (that is, skip the header row).
# NOTE: If you only wanted to extract a given count $count of data rows
#       from each file, add -First ($count+1) to the Get-Content call.
foreach ($file in $inFiles) {
  Get-Content $_.FullName | Select-Object -Skip 1 | 
    Set-Content -Append -Encoding Utf8 $outFile 
}

Обратите внимание на использование -Encoding Utf8 в качестве примера; отрегулируйте по мере необходимости; по умолчанию Set-Content будет использовать кодировку "ANSI" в Windows PowerShell и без спецификации UTF-8 в PowerShell Core .

Caveat : Выполняя построчную обработку простого текста, вы полагаетесь на каждую текстовую строку , представляющую одну строку данных CSV ; это обычно true, но это не обязательно.

И наоборот, если производительность имеет первостепенное значение, открытый текстовый подход может быть значительно ускорен при прямом использовании. NET такие методы, как [IO.File]::ReadLines() или, если файлы достаточно малы, даже [IO.File]::ReadAllLines().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...