我有多个CSV文件,我需要递归地找到并替换文本,我正在寻找最简单的方法来做到这一点。我知道。net有[io]。[/p]::readalltext, Get-Content和Import-CSV,但无论采用哪种方法,所有示例都指向特定的CSV,而不是它们的数组,我很难将它们中的任何一个转换为循环。
我只是替换了一个值"X"值为"y"。CSV文件有我可以使用的头,我认为Import-CSV和。replace将是最简单和最明智的方法。
首先,
我知道单个文件的IO方法,我想实现的是:
[io.file]::readalltext("C:Temptest.csv").replace("X","Y") | Out-File "C:Temptest.csv" -Encoding ascii –Force
Get-Content:
相同(Get-Content "C:Temptest.csv").replace('X', 'Y') | Set-Content "C:Temptest.csv"
和foreach循环:
$source = "C:Temptest.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'
}
但是失败了。
如果我理解正确,这段代码应该可以解决您的问题,详细信息请参阅内联注释:
# 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
}