使用Powershell修剪csv单元格字符串

时间:2015-05-27 12:14:59

标签: arrays string shell powershell csv

我在csv文件中的列上使用.Trim()函数时遇到问题。这个csv文件只包含整个表中的一列,所以它应该非常简单(他说)。

我的csv中的数据,附件A(注意:这是一个字段/列,而不是单独的列):

Name
C:\Users\kgroome\Documents\NOC\Documentation\Chrome, .pdf
C:\Users\kgroome\Documents\NOC\Documentation\CLI, .docx
C:\Users\kgroome\Documents\NOC\Documentation\DNS, .pdf
C:\Users\kgroome\Documents\NOC\Documentation\Encryption, .pdf
C:\Users\kgroome\Documents\NOC\Documentation\Excel, .xlsx

理想情况下,我需要在字符串中的最后5个字符之后从右到左修剪所有内容,或者在,后分割,因为这样会更理想

我目前在,之后的分割语法方面有以下几点:

$data = Import-Csv "C:\Support\Test05.csv"

foreach($line in $data){

    $line.split(',')[5].Trim(); |

    Export-Csv -Path "C:\Support\Test06.csv"

 }

虽然这不是我最好的,但我已经有了两种方法的先前语法,但我已经废弃它,因为它几乎无用。

非常感谢你的帮助,所以我知道为什么我出错了!

3 个答案:

答案 0 :(得分:0)

您使用CSV文件这一事实有点像红色鲱鱼,我想您想使用拆分的替换insread:

Get-Content "C:\Support\Test05.csv" | % {
    $_ -replace '\s*,\s*', ','
} | Set-Content "C:\Support\Test06.csv"

答案 1 :(得分:0)

我建议这样做可以帮助您了解代码无法正常运行的位置。我仍然不是完全确定你的输出应该是什么样的,并且有更好的方法来做到这一点(比如正则表达式)

$file = "c:\temp\text.csv"
$newfile = "c:\temp\text1.csv"

Get-Content $File | ForEach-Object{
    If($_ -match ","){
        $_.Split(",").Trim()[1]
    } Else {
        $_
    }
} | Set-Content $newfile

输出

Name
.pdf
.docx
.pdf
.pdf
.xlsx

Split根据您指定的分隔符从字符串创建数组。使用示例数据拆分逗号只会创建一个包含两个元素的数组。使用5请求第六个元素只会生成一个null。

对于正则表达式解决方案,这就足够了,并在原始文件中生成相同的输出。

(Get-Content $File) -replace ".*,\s?" | Set-Content $file

这里的正则表达式会抓取所有字符直到逗号以及下面的空格(如果存在)。由于匹配要求逗号位于第一行,而#34; Name"被跳过,因为它不匹配。

答案 2 :(得分:0)

也许这个:

gc "C:\Support\Test05.csv" | 
        % { $_.split(',')[-1].trim()} | 
                 set-content "C:\Support\Test06.csv"