我有一个.CSV文件,其中包含数字的记录很少,用双引号括起来(例如“455,365.44”)和引号之间的逗号。我需要从记录中的数值(“455,365.44”应该看起来像处理后的455365.44)中删除逗号,以便我可以在进一步处理文件时使用它们。
以下是文件
的示例column 1, column 2, column 3, column 4, column 5, column 6, column 7
12,"455,365.44","string with quotes, and with a comma in between","4,432",6787,890,88
432,"222,267.87","another, string with quotes, and with two comma in between","1,890",88,12,455
11,"4,324,653.22","simple string",77,777,333,22
我需要结果如下:
column 1, column 2, column 3, column 4, column 5, column 6, column 7
12,455365.44,"string with quotes, and with a comma in between",4432,6787,890,88
432,222267.87,"another, string with quotes, and with two comma in between",1890,88,12,455
11,4324653.22,"simple string",77,777,333,22
P.S:我只需要像这样转换的数值,字符串值应保持不变。
请帮忙......
答案 0 :(得分:4)
要删除引号(将引号替换为带引号的数字):
s/"(\d[\d.,]*)"/\1/g
对于逗号,我只能想到一个前瞻和后瞻,如果你的正则表达式实现支持那些(如果之前和之后的数字是引号内的数字,则用逗号替换逗号):
s/(?<="[\d,]+),(?=[\d,.]+")//g
您必须在删除引号之前执行此操作。
它也可以在没有外观的情况下工作:
s/,(?=[\d,.]*\d")//g
在shell脚本中,您可能需要使用 perl ,例如执行:
cat test.csv | perl -p -e 's/,(?=[\d,.]*\d")//g and s/"(\d[\d,.]*)"/\1/g'
正则表达式的解释:
首先执行:
s/,(?=[\d,.]*\d")//g
这将删除所有后跟数字([\d,.]*\d
)和引号的逗号,从而仅从引号内的数字中删除逗号
下一步执行
s/"(\d[\d,.]*)"/\1/g
这将使用不带引号的值替换引号内的所有数字