使用 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
}
我有一个子目录,每周我都会将 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
}