【发布时间】:2014-03-13 14:49:37
【问题描述】:
我有几个大的 csv 文件,我想在其中替换所有小于 100 的数字,包括用 500 或其他正数替换的负数。
我不是程序员,但我找到了一个不错的 perl one 行来用逗号 's/[^\S\n]+/,/g' 替换空格。我想知道是否有任何简单的方法可以做到这一点。
【问题讨论】:
标签: perl
我有几个大的 csv 文件,我想在其中替换所有小于 100 的数字,包括用 500 或其他正数替换的负数。
我不是程序员,但我找到了一个不错的 perl one 行来用逗号 's/[^\S\n]+/,/g' 替换空格。我想知道是否有任何简单的方法可以做到这一点。
【问题讨论】:
标签: perl
对 perl 1-liner 使用 Windows 格式
perl -F/,/ -lane "print join(q{,},map{/^[-\d.]+$/ && $_ < 100 ? 100: $_} @F),qq{\n};" input.csv > output.csv
【讨论】:
/^[-\d.]/ 做同样的事情,< 可以放在< input.csv 中也qq{\n} 将产生双换行符(-l 开关)
/^[-\d.]/ 做同样的事情?我会放下输入箭头。
$ 的数字才匹配,匹配一个或多个数字没有区别。
$ 边界。这不是一个完美的 IsNum 测试,但足以避免大多数潜在错误。
假设目录中有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
【讨论】: