用正则表达式替换csv中的千位分隔符

时间:2016-06-27 17:38:49

标签: regex powershell

我在尝试从一组文件中的某些货币值中提取千位分隔符时遇到了问题。 &#34;坏&#34;值用逗号和双引号分隔。其中还有其他值<&lt; 1000美元没有问题。

现有文件的示例:

"12,345.67",12.34,"123,456.78",1.00,"123,456,789.12"

所需文件的示例(删除了数千个分隔符):

"12345.67",12.34,"123456.78",1.00,"123456789.12"

我发现了一个正则表达式,用于将数字与分隔符匹配得很好,但是我在使用-replace运算符时遇到了麻烦。替换价值使我感到困惑。我读到了关于$&amp;我想知道我是否应该在这里使用它。我尝试了$ _,但是我的所有逗号都被删除了。我必须以某种方式使用$ match吗?

这是我的代码:

$Files = Get-ChildItem *input.csv
foreach ($file in $Files)
    {
        $file |
        Get-Content | #assume that I can't use -raw
        % {$_ -replace '"[\d]{1,3}(,[\d]{3})*(\.[\d]+)?"', ("$&" -replace ',','')} | #this is my problem
        out-file output.csv -append -encoding ascii
    }

3 个答案:

答案 0 :(得分:5)

Tony Hinkle的评论是答案:不要使用正则表达式(至少不要直接使用CSV文件)。

您的CSV有效,因此您应该对其进行解析,处理对象(如果需要,可以更改文本),然后编写新的CSV。

Import-Csv -Path .\my.csv | ForEach-Object {
    $_ | ForEach-Object {
        $_ -replace ',',''
    }
} | Export-Csv -Path .\my_new.csv

(此代码需要工作,特别是中间,因为行将每列作为属性,而不是数组,但更完整的CSV版本会更容易演示)

答案 1 :(得分:3)

您可以尝试使用此正则表达式:

,(?=(\d{3},?)+(?:\.\d{1,3})?")

请参阅Live Demo或powershell:

% {$_ -replace ',(?=(\d{3},?)+(?:\.\d{1,3})?")','' }

但它更多的是正则表达式带来的挑战。为了正常工作,请使用@briantist回答,这是干净的方法。

答案 2 :(得分:2)

我会使用更简单的正则表达式,并使用捕获组而不是整个捕获。 我已经使用您的输入测试了跟随正则表达式,但未发现任何问题。

% {$_ -replace '([\d]),([\d])','$1$2' }

例如。查找所有前后都有数字的逗号(以便奇怪的混合分割不重要)并完全替换逗号。

如果你的输入有一个没有奇怪混合引号而没有引号的场景,那么这会有问题。