Powershell 在不同文件中保存.csv行
警告:PowerShell新手正在工作 我得到了一个.csv文件,我正试图将其过滤并拆分为不同的部分。 数据看起来像是s.th。像这样(更多真实的专栏) 我现在需要执行两个步骤: 第1步:筛选只有Powershell 在不同文件中保存.csv行,powershell,import-csv,export-csv,Powershell,Import Csv,Export Csv,警告:PowerShell新手正在工作 我得到了一个.csv文件,我正试图将其过滤并拆分为不同的部分。 数据看起来像是s.th。像这样(更多真实的专栏) 我现在需要执行两个步骤: 第1步:筛选只有列4='400'的行的数据。我也只选了一些专栏,因为不是所有的专栏都对我感兴趣。并在这一点上添加一些自定义列 第二:根据column3是“50”还是“51”,将行拆分并保存在两个不同的文件中 $files = Get-ChildItem .\test\*.csv foreach ($file in $f
列4
='400'的行的数据。我也只选了一些专栏,因为不是所有的专栏都对我感兴趣。并在这一点上添加一些自定义列
第二:根据column3
是“50”还是“51”,将行拆分并保存在两个不同的文件中
$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;
文件51.csv
column1; column2; column3; column4; column5; column6; column7
DATA;012594;51;400;1;312354684;38768449;
我只是使用了以前使用过的代码的一些部分。如果这是一个完全错误的方向-不要犹豫说
提前谢谢你 您的代码示例处理多个输入文件。您似乎理解文件I/O,但正如评论员已经指出的,您没有使用PowerShell中内置的CSV和对象处理 首先,为了简单起见,并使下面的代码易于测试,我们将从中读取您的示例数据
$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
选择所需的列。在一行的末尾使用backtick` 现在我们可以通过管道将$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"
如果这有问题,有几种方法可以解决。您的代码示例处理多个输入文件。您似乎理解文件I/O,但正如评论员已经指出的,您没有使用PowerShell中内置的CSV和对象处理 首先,为了简单起见,并使下面的代码易于测试,我们将从中读取您的示例数据
$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
选择所需的列。在一行的末尾使用backtick` 现在我们可以通过管道将$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"
如果这有问题,有几种方法可以解决。我只是好奇。您不使用
Import Csv
读取Csv文件是否有特殊原因?$数据将变为空,因为它已写入文件。另外,CSV cmdlet肯定是首选。是的,非常简单:缺乏Powershell方面的知识/经验。谢谢你给我的提示,我只是好奇。您不使用Import Csv
读取Csv文件是否有特殊原因?$数据将变为空,因为它已写入文件。另外,CSV cmdlet肯定是首选。是的,非常简单:缺乏Powershell方面的知识/经验。谢谢你的提示/正确的方向。太好了!为了适应我的ofc脚本,我做了很多调整,但这正是我想要的。非常感谢你!完美的为了适应我的ofc脚本,我做了很多调整,但这正是我想要的。非常感谢你!