powershell 使用查找和替换循环更新多个CSV文件

qxsslcnc  于 2023-01-05  发布在  Shell
关注(0)|答案(1)|浏览(124)

我有多个CSV文件,我需要递归查找和替换其中的文本,我正在寻找最简单的方法来做到这一点。我知道. NET有[io. file]::readalltext,Get-Content和Import-CSV,但无论方法如何,所有的例子都指向一个特定的CSV,而不是它们的数组,我很难将它们中的任何一个转换为循环。
我只是用值"Y"替换值"X"。CSV文件有我可以使用的头文件,我认为Import-CSV和. Replace是最简单和最明智的方法。
对于初学者,
我知道对于我想要实现的单个文件的IO方法是:
第一个月
内容获取功能相同:
(Get-Content "C:\Temp\test.csv").replace('X', 'Y') | Set-Content "C:\Temp\test.csv"
和foreach循环:

$source = "C:\Temp\test.csv"

$csv = Import-Csv $source

foreach ($line in $csv) {
    $line.'COLUMNA' = $line.'COLUMNA'.Replace("X","Y")
}

$csv | Export-Csv $source'.bak' -NoTypeInformation

我只是似乎很难掌握如何形成foreach()的集合部分,以便可以处理多个文件。
foreach ($<item> in $<collection>){<statement list>
我确实有一个脚本,它导入这些文件,并做了一些修改,我会尝试将最佳答案合并到其中,但如果它是单独列出的,那就太好了,这样其他人就可以更好地理解它,而不会有额外的变量把它搞砸。

Get-ChildItem -Path $source -Recurse -Include *.csv | ForEach-Object {
    $path = $_.FullName;
    $_.FullName | Import-Csv | ForEach-Object {
        $_.'COLUMND' = $_.'COLUMNB'+'-'+$_.'COLUMNC';
        $_
    } | Export-Csv -NoTypeInformation -Path $path'.bak'
}

编辑:我试过

Get-ChildItem -Path $source -Include *.csv | ForEach-Object {
  $path = $_.FullName;
  $_.FullName | Import-Csv | ForEach-Object {
      foreach($line in Import-CSV $path){
        $line.'COLUMNA' = $line.'COLUMNA'.Replace("X","Y")
      }
  } | Export-Csv -NoTypeInformation -Path $path'.bak'
}

但那失败了。

nom7f22z

nom7f22z1#

如果我没理解错的话,这段代码应该可以解决你的问题,详情请参见内联注解:

# get all CSVs in `$source` and enumerate them
Get-ChildItem -Path $source -Filter *.csv | ForEach-Object {
    $_ | Import-Csv | ForEach-Object {
        $columnD = '{0}-{1}' -f $_.COLUMNB, $_.COLUMNC
        # using this method ensures that
        # - if the `COLUMND` does not exist it will be added
        # - if the `COLUMND` exists, it will be replaced with a new value
        $_.PSObject.Properties.Add([psnoteproperty]::new('COLUMND', $columnD))
        
        # update `COLUMNA` replacing all `X` with `Y`
        $_.COLUMNA = $_.COLUMNA.Replace('X', 'Y')

        # output the updated object
        $_
    } | Export-Csv ($_.FullName + '.bak') -NoTypeInformation
}

相关问题