使用 powershell 根据内容将内容从一个 .csv 拆分为多个文件
Split content from one .csv to multiple files based on content using powershell
我有一个包含两种类型行的 .csv 文件。第一个包含 header-information。它总是以 AB
开头。第二类包含内容。这个总是以 CD
开头。
每个 header-row 之后可以有多个 content-rows (总是至少一个)。他们在一起直到下一个 header-row(再次从 AB
开始)。
示例:
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654321; EUR
CD; 456789; 22.24; Text; SW;
AB; 12345; AB123456789; 10.03.2021; GT; BC987654322; EUR
CD; 354345; 85.45; Text; SW;
CD; 123556; 94.63; Text; SW;
CD; 354564; 12.34; Text; SW;
CD; 135344; 32.23; Text; SW;
AB; 12345; AB123456789; 10.03.2021; GT; BC987654323; EUR
CD; 354564; 12.34; Text; SW;
CD; 852143; 34.97; Text; SW;
如何将此文件拆分为多个。csv-files - 每个 header-row (AB) - 使用 PowerShell。我想要的结果是
BC987654321.csv
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654321; EUR
CD; 456789; 22.24; Text; SW;
BC987654322.csv
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654322; EUR
CD; 354345; 85.45; Text; SW;
CD; 123556; 94.63; Text; SW;
CD; 354564; 12.34; Text; SW;
CD; 135344; 32.23; Text; SW;
和BC987654323.csv
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654323; EUR
CD; 354564; 12.34; Text; SW;
CD; 852143; 34.97; Text; SW;
我根本不习惯 PowerShell - 所以我会感谢 newb-friendly 解决方案。
非常感谢您。
如果我理解正确,您想在 'header1' 等于 'AB' 的每一行上拆分 csv,然后使用 'header6' 下该行中的内容作为输出文件名。
$path = 'D:\Test'
$fileIn = Join-Path -Path $path -ChildPath 'input.csv'
$fileOut = $null # will get a value in the loop
$splitValue = 'AB' # the header1 value that decides to start a new file
$csv = Import-Csv -Path $fileIn -Delimiter ';'
# get an array of the column headers
$allHeaders = $csv[0].PsObject.Properties.Name
foreach ($item in $csv) {
if ($item.header1 -eq $splitValue) {
# start a new file
$fileOut = Join-Path -Path $path -ChildPath ('{0}.csv' -f $item.header6)
# create the new csv file with the first row of data already in it
$item | Select-Object $allHeaders | Export-Csv -Path $fileOut -Delimiter ';' -NoTypeInformation
}
else {
# rows with header1 not 'AB' are added to that file
if ([string]::IsNullOrEmpty($fileOut)) {
Write-Warning "Could not find a starting row (header1 = '$splitValue') for the file"
}
else {
$item | Select-Object $allHeaders | Export-Csv -Path $fileOut -Delimiter ';' -Append
}
}
}
当然,更改路径以匹配您的环境。
输出:
BC987654321.csv
"header1";"header2";"header3";"header4";"header5";"header6";"header7"
"AB";"12345";"AB123456789";"10.03.2021";"GT";"BC987654321";"EUR"
"CD";"456789";"22.24";"Text";"SW";"";
BC987654322.csv
"header1";"header2";"header3";"header4";"header5";"header6";"header7"
"AB";"12345";"AB123456789";"10.03.2021";"GT";"BC987654322";"EUR"
"CD";"354345";"85.45";"Text";"SW";"";
"CD";"123556";"94.63";"Text";"SW";"";
"CD";"354564";"12.34";"Text";"SW";"";
"CD";"135344";"32.23";"Text";"SW";"";
BC987654323.csv
"header1";"header2";"header3";"header4";"header5";"header6";"header7"
"AB";"12345";"AB123456789";"10.03.2021";"GT";"BC987654323";"EUR"
"CD";"354564";"12.34";"Text";"SW";"";
"CD";"852143";"34.97";"Text";"SW";;
我有一个包含两种类型行的 .csv 文件。第一个包含 header-information。它总是以 AB
开头。第二类包含内容。这个总是以 CD
开头。
每个 header-row 之后可以有多个 content-rows (总是至少一个)。他们在一起直到下一个 header-row(再次从 AB
开始)。
示例:
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654321; EUR
CD; 456789; 22.24; Text; SW;
AB; 12345; AB123456789; 10.03.2021; GT; BC987654322; EUR
CD; 354345; 85.45; Text; SW;
CD; 123556; 94.63; Text; SW;
CD; 354564; 12.34; Text; SW;
CD; 135344; 32.23; Text; SW;
AB; 12345; AB123456789; 10.03.2021; GT; BC987654323; EUR
CD; 354564; 12.34; Text; SW;
CD; 852143; 34.97; Text; SW;
如何将此文件拆分为多个。csv-files - 每个 header-row (AB) - 使用 PowerShell。我想要的结果是
BC987654321.csv
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654321; EUR
CD; 456789; 22.24; Text; SW;
BC987654322.csv
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654322; EUR
CD; 354345; 85.45; Text; SW;
CD; 123556; 94.63; Text; SW;
CD; 354564; 12.34; Text; SW;
CD; 135344; 32.23; Text; SW;
和BC987654323.csv
header1; header2; header3; header4; header5; header6; header7
AB; 12345; AB123456789; 10.03.2021; GT; BC987654323; EUR
CD; 354564; 12.34; Text; SW;
CD; 852143; 34.97; Text; SW;
我根本不习惯 PowerShell - 所以我会感谢 newb-friendly 解决方案。
非常感谢您。
如果我理解正确,您想在 'header1' 等于 'AB' 的每一行上拆分 csv,然后使用 'header6' 下该行中的内容作为输出文件名。
$path = 'D:\Test'
$fileIn = Join-Path -Path $path -ChildPath 'input.csv'
$fileOut = $null # will get a value in the loop
$splitValue = 'AB' # the header1 value that decides to start a new file
$csv = Import-Csv -Path $fileIn -Delimiter ';'
# get an array of the column headers
$allHeaders = $csv[0].PsObject.Properties.Name
foreach ($item in $csv) {
if ($item.header1 -eq $splitValue) {
# start a new file
$fileOut = Join-Path -Path $path -ChildPath ('{0}.csv' -f $item.header6)
# create the new csv file with the first row of data already in it
$item | Select-Object $allHeaders | Export-Csv -Path $fileOut -Delimiter ';' -NoTypeInformation
}
else {
# rows with header1 not 'AB' are added to that file
if ([string]::IsNullOrEmpty($fileOut)) {
Write-Warning "Could not find a starting row (header1 = '$splitValue') for the file"
}
else {
$item | Select-Object $allHeaders | Export-Csv -Path $fileOut -Delimiter ';' -Append
}
}
}
当然,更改路径以匹配您的环境。
输出:
BC987654321.csv
"header1";"header2";"header3";"header4";"header5";"header6";"header7"
"AB";"12345";"AB123456789";"10.03.2021";"GT";"BC987654321";"EUR"
"CD";"456789";"22.24";"Text";"SW";"";
BC987654322.csv
"header1";"header2";"header3";"header4";"header5";"header6";"header7"
"AB";"12345";"AB123456789";"10.03.2021";"GT";"BC987654322";"EUR"
"CD";"354345";"85.45";"Text";"SW";"";
"CD";"123556";"94.63";"Text";"SW";"";
"CD";"354564";"12.34";"Text";"SW";"";
"CD";"135344";"32.23";"Text";"SW";"";
BC987654323.csv
"header1";"header2";"header3";"header4";"header5";"header6";"header7"
"AB";"12345";"AB123456789";"10.03.2021";"GT";"BC987654323";"EUR"
"CD";"354564";"12.34";"Text";"SW";"";
"CD";"852143";"34.97";"Text";"SW";;