如何解决将 .csv 行保存在不同的文件中
警告:PowerShell-newb 正在工作。
我得到了一个 .csv 文件,我正在尝试将其过滤并拆分为不同的部分。 数据看起来很糟糕。像这样(实际上更多的列)
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;
我现在需要做两个步骤:
1st:过滤只有 column4
= '400' 的行的数据。还只选择一些列,因为并非所有列都对我感兴趣。并在此时添加一些自定义列。
2nd:根据 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,@{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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。