Примечание: Это более быстрая альтернатива - полезного ответа thepip3r , а также охватывает аспект сохранения измененного содержимого обратно в файлы CSV:
с помощью оператор switch
для эффективного l oop по строкам файлов в виде text позволяет избежать дорогостоящих вызовов ConvertFrom-Csv
, Select-Object
и Export-Csv
.
Обратите внимание, что оператор switch
заключен в $()
, оператор подвыражения , чтобы обеспечить возможность обратной записи в один и тот же файл в одном конвейере; однако для этого необходимо сохранить весь (измененный) файл в памяти; если это не вариант, заключите оператор switch
в & { ... }
и перенаправьте его в Set-Content
во временный файл, который позже вы сможете использовать для замены исходного файла.
# Create a sample CSV file in the current dir.
@'
dinosaur.csv,water,Benjamin.Field.12.Location53.Readings,
DATE,VALUE,QUALITY,STATE
2018-06-01,73.83,Good,0
2018-06-02,45.53,Good,0
2018-06-03,89.123,Good,0
'@ > sample.csv
# Loop over all *.csv files in the current dir.
foreach ($csvFile in Get-Item *.csv) {
$ndx = 0
$(
switch -File $csvFile.FullName {
default {
if ($ndx -eq 0) { # 1st line
$suffix = $_ -replace ',$' # save the suffix to append to data rows later
} elseif ($ndx -eq 1) { # header row
$_ + ',FILENAME,PRODUCT,TAG' # add additional column headers
} else { # data rows
$_ + ',' + $suffix # append suffix
}
++$ndx
}
}
) # | Set-Content $csvFile.FullName # <- activate this to write back to the same file.
# Use -Encoding as needed.
}
Выше приведено следующее:
DATE,VALUE,QUALITY,STATE,FILENAME,PRODUCT,TAG
2018-06-01,73.83,Good,0,dinosaur.csv,water,Benjamin.Field.12.Location53.Readings
2018-06-02,45.53,Good,0,dinosaur.csv,water,Benjamin.Field.12.Location53.Readings
2018-06-03,89.123,Good,0,dinosaur.csv,water,Benjamin.Field.12.Location53.Readings