Power Shell代码删除列标题中的特殊字符(.csv文件)

时间:2020-02-12 15:07:42

标签: powershell powershell-2.0 powershell-3.0

我试图遍历路径中的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

}

4 个答案:

答案 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
}