删除特定csv列

时间:2017-11-06 16:28:56

标签: powershell csv

我正在尝试删除CSV文件中列数据的开始和结束空格。我有一个解决方案来删除csv中的所有空格,但是它在描述列中创建了不可读的文本。

Get-Content –path test.csv| ForEach-Object {$_.Trim() -replace "\s+"   } |  Out-File -filepath out.csv -Encoding ascii

e.g。

'192.168.1.2'   ' test-1-TEST'  'Ping Down at least 1 min'  '3/11/2017' 'Unix Server'   'Ping'  'critical'
'192.168.1.3'   ' test-2-TEST'  ' Ping Down at least 3 min' '3/11/2017' 'windows Server'    'Ping'  'critical'

我只想从' test-1-TEST'而不是'Ping Down at least 1 min'删除空间。这可能吗?

2 个答案:

答案 0 :(得分:1)

"IP","ServerName","Status","Date","ServerType","Test","State"
"192.168.1.2"," test-1-TEST","Ping Down at least 1 min","3/11/2017","Unix Server","Ping","critical"
"192.168.1.3"," test-2-TEST"," Ping Down at least 3 min","3/11/2017","windows Server","Ping","critical"

例如上面的文件:

Import-Csv C:\folder\file.csv | ForEach-Object {
        $_.ServerName = $_.ServerName.trim()
        $_
} | Export-Csv C:\folder\file2.csv -NoTypeInformation

ServerName替换为要从中删除空格的列的名称(又名trim)。

答案 1 :(得分:0)

如果您的CSV没有标题(这意味着它不是真正的CSV)和/或您希望更好地保留原始文件结构和格式,您可以尝试稍微扩展您的正则表达式。

(Get-Content c:\temp\test.txt -Raw) -replace "(?<=')\s+(?=[^' ])|(?<=[^' ])\s+(?=')"

这应该删除引用值中的所有前导和尾随空格。不是自己的分界线。

将文件作为一个字符串读取。根据文件大小可能是坏主意。不需要,因为解决方案不依赖于此。仍然可以读取与实现相同结果的相同转换线。使用两个相似的替换。首先是查找单引号后存在的空格,但后面没有其他引号或空格。其次是在报价前面没有引号或空格的空格。

只是想给一个正则表达式的例子。您可以在regex101.com处查看更多详情和解释。在那里,您将看到一个交替模式,而不是两个单独的替换。

(Get-Content c:\temp\test.txt -Raw) -replace "(?<=')\s+(?=[^' ])|(?<=[^' ])\s+(?=')"

第一个例子在眼睛上更容易。

我遇到的问题一直在复制这个问题但是如果你在替换新行时遇到问题,那么你可以一次更换一行,这也应该有效。

(Get-Content c:\temp\test.txt) | Foreach-Object{
    $_ -replace "(?<=')\s+(?=[^' ])|(?<=[^' ])\s+(?=')"
} | Set-Content c:\temp\test.txt