将 .csv 行保存在不同的文件中
save .csv rows in different files
警告:PowerShell-newb 正在工作。
我得到了一个 .csv 文件,我正在尝试将其过滤并分成不同的部分。
数据看起来 s.th。像这样(实际上有更多列)
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
DATA;012594;50;401;1;456321564;53464554;
DATA;012594;50;402;1;321567894;54634858;
DATA;012594;51;400;1;312354684;38768449;
DATA;012594;51;410;1;123153167;54648648;
我现在需要做 2 个步骤:
1st:筛选只有 column4
= '400' 的行的数据。还选择了一些专栏,因为我并不对所有专栏感兴趣。并在此时添加一些自定义列。
第 2 步:根据 column3
是“50”还是“51”,将行拆分并保存在 2 个不同的文件中。
$files = Get-ChildItem .\test\*.csv
foreach ($file in $files) {
$fname = $file.Name
$data = (Get-Content -path $file) | Select-Object -skip 1 | Foreach-Object {
$_ -replace '\|',';'
} | Set-Content -Path ".\test-out${fname}"
foreach ($rec in $data){
$status = $rec.Substring(16,3)
if ($status -eq "400"){
Write-Warning "400 found"
$csv400q = [PSCustomObject]@{
'column 1' = $rec.'column 1'
'column 2' = $rec.'column 2'
'column 3' = $rec.'column 3'
'column 4' = $rec.'column 4'
'column 5' = $rec.'column 5'
'column 6' = $rec.'column 6'
'column 7' = $rec.'column 7'
'new column1' = 'static text'
'new column2' = 'static text'
'new column3' = 'static text'
}
$csv400o += $csv400q
}
}
$csv400o | Export-Csv -Path ".\test-out${fname}" -Delimiter ";" -NoTypeInformation
#Step #2 should be here
foreach ($rec in $data) {
$lunk = $rec.Substring(13,2)
if ($lunk -like "50") {
} elseif ($lunk -like "51") {
}
}
}
文件比这个例子大得多。但是对于这个样本数据,期望的结果是
file50.csv
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
file51.csv
column1; column2; column3; column4; column5; column6; column7
DATA;012594;51;400;1;312354684;38768449;
我只是使用了以前使用过的代码的一些部分。如果那是完全错误的方向 - 请毫不犹豫地说出来。
提前致谢!
您的代码示例处理多个输入文件。您似乎理解文件 I/O 但正如评论者已经指出的那样,您没有使用 PowerShell 中的内置 CSV 和对象处理。
首先,为了简单起见,我们将从 here-string 中读取您的示例数据,并使下面的代码易于测试
$YourData = @'
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
DATA;012594;50;401;1;456321564;53464554;
DATA;012594;50;402;1;321567894;54634858;
DATA;012594;51;400;1;312354684;38768449;
DATA;012594;51;410;1;123153167;54648648;
'@
# Treat the here-string as CSV data
$YourCSV = $YourData | ConvertFrom-Csv -Delimiter ";"
您的问题涉及两个步骤。使用 Where-Object
进行过滤。
使用 Select-Object
选择您想要的列。
在 line continuation
的行尾使用反引号 `
# 1st: Filter the data for rows that have only column4 = '400'.
# Also picking just some columns as not all are of interest to me.
# And adding some custom columns at this point as well.
$Step1 = $YourCSV | Where-Object column4 -EQ '400' | Select-Object column1,column3,column4, `
@{Name="Col10";Expression={"your text"}},@{Name="Col11";Expression={"other text"}}
# Above line with shortened syntax. Same result
$Step1 = $YourCSV | ? column4 -EQ '400' | Select column1,column3,column4,@{N="Col10";E={"your text"}},@{N="Col11";E={"other text"}}
现在我们可以将 $Step1 变量的输出通过管道传输到 CSV。首先再次使用 Where-Object
对其进行过滤。由于您给出了两个具体案例(50 和 51),这就是下面所展示的。
#2nd: Split and save the rows in 2 different files depending whether column3 is '50' or '51'.
$Step1 | Where-Object column3 -EQ '50' | Export-Csv -Delimiter ";" -Path file50.csv -NoTypeInformation
$Step1 | Where-Object column3 -EQ '51' | Export-Csv -Delimiter ";" -Path file51.csv -NoTypeInformation
请注意,输出数据将像这样用引号引起来。
"column1";"column3";"column4";"Col10";"Col11"
"DATA";"50";"400";"your text";"other text"
如果这有问题,有几种方法可以 remove the quotes。
警告:PowerShell-newb 正在工作。
我得到了一个 .csv 文件,我正在尝试将其过滤并分成不同的部分。 数据看起来 s.th。像这样(实际上有更多列)
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
DATA;012594;50;401;1;456321564;53464554;
DATA;012594;50;402;1;321567894;54634858;
DATA;012594;51;400;1;312354684;38768449;
DATA;012594;51;410;1;123153167;54648648;
我现在需要做 2 个步骤:
1st:筛选只有 column4
= '400' 的行的数据。还选择了一些专栏,因为我并不对所有专栏感兴趣。并在此时添加一些自定义列。
第 2 步:根据 column3
是“50”还是“51”,将行拆分并保存在 2 个不同的文件中。
$files = Get-ChildItem .\test\*.csv
foreach ($file in $files) {
$fname = $file.Name
$data = (Get-Content -path $file) | Select-Object -skip 1 | Foreach-Object {
$_ -replace '\|',';'
} | Set-Content -Path ".\test-out${fname}"
foreach ($rec in $data){
$status = $rec.Substring(16,3)
if ($status -eq "400"){
Write-Warning "400 found"
$csv400q = [PSCustomObject]@{
'column 1' = $rec.'column 1'
'column 2' = $rec.'column 2'
'column 3' = $rec.'column 3'
'column 4' = $rec.'column 4'
'column 5' = $rec.'column 5'
'column 6' = $rec.'column 6'
'column 7' = $rec.'column 7'
'new column1' = 'static text'
'new column2' = 'static text'
'new column3' = 'static text'
}
$csv400o += $csv400q
}
}
$csv400o | Export-Csv -Path ".\test-out${fname}" -Delimiter ";" -NoTypeInformation
#Step #2 should be here
foreach ($rec in $data) {
$lunk = $rec.Substring(13,2)
if ($lunk -like "50") {
} elseif ($lunk -like "51") {
}
}
}
文件比这个例子大得多。但是对于这个样本数据,期望的结果是
file50.csv
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
file51.csv
column1; column2; column3; column4; column5; column6; column7
DATA;012594;51;400;1;312354684;38768449;
我只是使用了以前使用过的代码的一些部分。如果那是完全错误的方向 - 请毫不犹豫地说出来。
提前致谢!
您的代码示例处理多个输入文件。您似乎理解文件 I/O 但正如评论者已经指出的那样,您没有使用 PowerShell 中的内置 CSV 和对象处理。
首先,为了简单起见,我们将从 here-string 中读取您的示例数据,并使下面的代码易于测试
$YourData = @'
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
DATA;012594;50;401;1;456321564;53464554;
DATA;012594;50;402;1;321567894;54634858;
DATA;012594;51;400;1;312354684;38768449;
DATA;012594;51;410;1;123153167;54648648;
'@
# Treat the here-string as CSV data
$YourCSV = $YourData | ConvertFrom-Csv -Delimiter ";"
您的问题涉及两个步骤。使用 Where-Object
进行过滤。
使用 Select-Object
选择您想要的列。
在 line continuation
# 1st: Filter the data for rows that have only column4 = '400'.
# Also picking just some columns as not all are of interest to me.
# And adding some custom columns at this point as well.
$Step1 = $YourCSV | Where-Object column4 -EQ '400' | Select-Object column1,column3,column4, `
@{Name="Col10";Expression={"your text"}},@{Name="Col11";Expression={"other text"}}
# Above line with shortened syntax. Same result
$Step1 = $YourCSV | ? column4 -EQ '400' | Select column1,column3,column4,@{N="Col10";E={"your text"}},@{N="Col11";E={"other text"}}
现在我们可以将 $Step1 变量的输出通过管道传输到 CSV。首先再次使用 Where-Object
对其进行过滤。由于您给出了两个具体案例(50 和 51),这就是下面所展示的。
#2nd: Split and save the rows in 2 different files depending whether column3 is '50' or '51'.
$Step1 | Where-Object column3 -EQ '50' | Export-Csv -Delimiter ";" -Path file50.csv -NoTypeInformation
$Step1 | Where-Object column3 -EQ '51' | Export-Csv -Delimiter ";" -Path file51.csv -NoTypeInformation
请注意,输出数据将像这样用引号引起来。
"column1";"column3";"column4";"Col10";"Col11"
"DATA";"50";"400";"your text";"other text"
如果这有问题,有几种方法可以 remove the quotes。