Примечание. В решении в этом ответе специально используется обработка простого текста для обработки файлов по двум причинам:
Использование 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()
.