【问题标题】:Perl script for normalizing negative numbers用于规范化负数的 Perl 脚本
【发布时间】:2014-03-13 14:49:37
【问题描述】:

我有几个大的 csv 文件,我想在其中替换所有小于 100 的数字,包括用 500 或其他正数替换的负数。

我不是程序员,但我找到了一个不错的 perl one 行来用逗号 's/[^\S\n]+/,/g' 替换空格。我想知道是否有任何简单的方法可以做到这一点。

【问题讨论】:

    标签: perl


    【解决方案1】:

    对 perl 1-liner 使用 Windows 格式

    perl -F/,/ -lane "print join(q{,},map{/^[-\d.]+$/ && $_ < 100 ? 100: $_} @F),qq{\n};" input.csv > output.csv
    

    【讨论】:

    • /^[-\d.]/ 做同样的事情,&lt; 可以放在&lt; input.csv 中也qq{\n} 将产生双换行符(-l 开关)
    • 什么意思 /^[-\d.]/ 做同样的事情?我会放下输入箭头。
    • 由于您直到结束 $ 的数字才匹配,匹配一个或多个数字没有区别。
    • 啊,我明白你现在做了什么不同的事情了。是的。所以我添加了$ 边界。这不是一个完美的 IsNum 测试,但足以避免大多数潜在错误。
    【解决方案2】:

    假设目录中有2个文件,以下对我有用:

    test1.txt:

    201,400,-1
    -2.5,677,90.66,30.32
    222,18
    

    test2.txt

    -1,-1,-1,99,101
    3,3,222,190,-999
    22,100,100,3
    

    使用一个衬垫:

    perl -p -i.bak -e 's/(-?\d+\.?\d*)/$1<100?500:$1/ge' *
    

    -p 将对每个文件中的每一行应用搜索替换过程,-i.bak 表示在原始文件中进行替换,并使用扩展名为 .bak 的新文件备份这些文件。 s///ge 部分会查找所有数字(包括负数),然后将每个数字与 100 进行比较,如果小于 100 则将其替换为 500。g 表示查找所有匹配数字。 e 表示替换部分将被视为 Perl 代码。 * 表示处理目录下的所有文件

    执行这一行后,我在目录中得到了 4 个文件:

    test1.txt.bak test1.txt test2.txt.bak test2.txt
    

    test1.txt 和 test2.txt 的内容是:

    test1.txt

    201,400,500
    500,677,500,500
    222,500
    

    test2.txt

    500,500,500,500,101
    500,500,222,190,500
    500,100,100,500
    

    【讨论】:

    • 这很好用。是否可以做或大于某个数字,还是我只需要运行两次?
    • 你的意思是它是否适用于更多文件?它将处理目标目录中的所有文件,我只是放了2个文件作为示例。
    猜你喜欢
    • 2023-03-19
    • 2018-01-02
    • 2011-05-05
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多