将 .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