我有多个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'
}
但那失败了。
1条答案
按热度按时间nom7f22z1#
如果我没理解错的话,这段代码应该可以解决你的问题,详情请参见内联注解: