我试图遍历路径中的40个CSV文件,并删除仅在标头中不包含数字,字母和空格的所有字符。
下面是我尝试处理的代码,它适用于文件中的标头,但是它替换了文件中的所有数据,我只能看到其中没有特殊字符的标头,我只是一个初学者外壳,不确定如何进一步进行任何帮助,将不胜感激。
$path = "C:\AllFiles\"
Get-ChildItem -path $path -Filter *.csv |
Foreach-Object {
$content = Get-Content $_.FullName
$content[0] = $content[0] -replace '[^0-9a-zA-Z, ]'|Set-Content $_.FullName
}
答案 0 :(得分:2)
-replace运算符需要两个值,第一个值是您要查找的值,第二个值是替换第一个值的内容。
示例:
"John Jones" -replace "Jones","Smith"
这将用文本“ Smith”替换“ Jones”,从而创建新的字符串“ John Smith”
在您的示例中,不要为要保留的内容创建正则表达式,而要为要替换的内容创建正则表达式。
示例:
$path = "C:\AllFiles\"
Get-ChildItem -path $path -Filter *.csv |
Foreach-Object {
$content = Get-Content -Path $path
$content[0] = $content[0] -replace '[regex for special chars]',""
Set-Content $path -value $content -force
}
这将替换整个字符串,并替换为将正则表达式值替换为“”的字符串。
答案 1 :(得分:1)
非常接近,请像这样尝试:
$path = "C:\temp"
Get-ChildItem -path $path -Filter *.csv |
Foreach-Object {
$content = Get-Content $_
$content[0] = $content[0] -replace '[^a-zA-Z0-9, ]',''
$content | Out-File $_
}
这只会清除第一行中的特殊字符,而保留文件的其余部分不变。
答案 2 :(得分:1)
这应该可以解决问题,并且应该是最快的方法:
$path = 'C:\AllFiles\'
$collection = Get-ChildItem -path $path -Filter *.csv'
foreach( $file in $collection ) {
$content = [System.IO.File]::ReadAllLines( $file.FullName )
$content[0] = $content[0] -replace '[^0-9a-zA-Z, ]'
[System.IO.File]::WriteAllLines( $file.FullName, $content ) | Out-Null
}
答案 3 :(得分:1)
尝试一下:
dir "C:\AllFiles" -Filter *.csv | % {
(Get-Content $_.FullName)[0] -replace '[\W]', '' | Set-Content $_.FullName -Force
}