从.CSV文件的数值中删除双引号和逗号

时间:2013-09-04 22:23:52

标签: linux csv comma double-quotes

我有一个.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:我只需要像这样转换的数值,字符串值应保持不变。

请帮忙......

1 个答案:

答案 0 :(得分:4)

要删除引号(将引号替换为带引号的数字):

s/"(\d[\d.,]*)"/\1/g

rubular

对于逗号,我只能想到一个前瞻和后瞻,如果你的正则表达式实现支持那些(如果之前和之后的数字是引号内的数字,则用逗号替换逗号):

s/(?<="[\d,]+),(?=[\d,.]+")//g

您必须在删除引号之前执行此操作。

它也可以在没有外观的情况下工作:

s/,(?=[\d,.]*\d")//g

rubular

在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

这将使用不带引号的值替换引号内的所有数字