使用 Powershell,如何过滤子目录内容中的每个文件,将过滤后的文件与修改后的原始文件名一起写出?

Using Powershell, How do I filter each file in a subdirectories content, write out the filtered file with a modded original filename as a one liner?

我有一个子目录,每周我都会将 CSV 文件转储到该子目录中。 我想获取文件,根据内容删除某些文件,然后在 'Filtered' 子目录中重写文件。 它必须是一个班轮。

我最接近的是将结果作为单个文件提供。我想“解析一个 csv,过滤它,用原始文件名的版本保存它,然后保存到下一个文件,下一个文件等。 数据是 8 个小的系列,3 个字段 CSV。

(示例)源 CSV:

"Test","Tested","Total"
"2021-A-0123","12","20"
"2021-B-0125","15","19"
"2021-A-0123-S","10","11"
"2022-A-0126","10","11"

** 代码:**

Import-Csv -Path (Get-ChildItem -Path 'C:\Users\me\Documents\' -Filter '*.csv').FullName | where-object {$_."Test" -Match "^202[1,2]-A-[0-9]{4}$"} 

结果

Test        Tested     Total
--------    ---------- -----
2021-A-0123 12         20   
2022-A-0126 10         11   
2021-A-0123 12         20   
2022-A-0126 10         11   
2021-A-0123 12         20   
2022-A-0126 10         11   
2021-A-0123 12         20   
2022-A-0126 10         11   
2021-A-0123 12         20   
2022-A-0126 10         11

如果我没理解错的话,你只需要遍历每个 CSV 并在过滤后保存每个新版本。

这里你只需要定义初始文件夹和目标文件夹,这两个变量都在脚本的顶部定义。代码可能比实际需要的更冗长,但我相信这样更好,因此您可以遵循思路。

在这种情况下(在我看来在大多数情况下),如果其他人正在阅读您的代码,那么单行代码可能很难阅读并且更难维护。

$initialFolder = 'path/to/csvFolder'
$destinationFolder = 'path/to/filteredCsvFolder'

foreach($file in Get-ChildItem $initialFolder -Filter *.csv)
{
    $fileName = "{0} - FILTERED" -f $file.Name
    $exportPath = Join-Path $destinationFolder -ChildPath $fileName

    Import-Csv $file |
    Where-Object { $_.Test -Match "^202[1,2]-A-[0-9]{4}$" } |
    Export-Csv $exportPath -NoTypeInformation
}