【问题标题】:replace thousands separators in csv with regex用正则表达式替换 csv 中的数千个分隔符
【发布时间】:2016-06-27 17:38:48
【问题描述】:

我在尝试从一组文件中的某些货币值中提取千位分隔符时遇到了问题。 “坏”值用逗号和双引号分隔。那里还有其他价值小于 1000 美元的值。

现有文件示例:

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

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

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

我找到了一个用于将数字与分隔符匹配的正则表达式,效果很好,但我在使用 -replace 运算符时遇到了问题。重置价值让我感到困惑。我读到了 $& ,我想知道我是否应该在这里使用它。我尝试了 $_,但这会拉出我所有的逗号。我必须以某种方式使用 $matches 吗?

这是我的代码:

$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
    }

【问题讨论】:

  • 使用 import-csv 然后您可以遍历行和项目,从每个项目中删除逗号,同时构建新行,然后将新行保存到文件中覆盖它。

标签: regex powershell


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    你可以试试这个正则表达式:

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

    Live Demo或在powershell中:

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

    但更多的是关于正则表达式可以带来的挑战。为了正常工作,请使用@briantist 答案,这是执行此操作的干净方法。

    【讨论】:

    • 这就像一个冠军,并促使我阅读更多关于“积极断言”和“前瞻组”之类的内容。谢谢托马斯。
    【解决方案3】:

    我会使用更简单的正则表达式,并使用捕获组而不是整个捕获。 我已经用你的输入测试了下面的正则表达式,没有发现任何问题。

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

    例如。查找前后所有带数字的逗号(这样奇怪的混合拆分就无关紧要了)并完全替换逗号。

    如果您的输入有一个没有引号和没有引号的奇怪混合的场景,这将有问题。

    【讨论】:

    • 就个人而言,我喜欢这个答案。您可以直接将文件作为文本导入,运行正则表达式替换,然后将其作为文本输出。无需将事物转换为对象,因此应该减少开销。您甚至可以将其设为前瞻/后视并跳过替换的最后一部分。 RegEx101 Example
    • 这也很棒。我认为使用多个分隔符(例如 123,456,789.12)会失败,但它可以工作,现在我明白为什么了。
    • 非常感谢 ConstantineK 的回答,以及 TheMadTechnician 的 RedEx 链接!我使用在线测试仪转换了我所有的数字!
    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多