从 .CSV 文件的数值中删除双引号和逗号
Posted
技术标签:
【中文标题】从 .CSV 文件的数值中删除双引号和逗号【英文标题】:Remove double quotes and comma from a numeric value of a .CSV file 【发布时间】:2013-09-04 22:23:51 【问题描述】:我有一个 .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:我只需要像这样转换数字的值,字符串值应该保持不变。
请帮忙...
【问题讨论】:
您使用哪种语言来执行此操作(不要说regex
)?您知道您的数字字段将出现在哪些列中吗?
@MikeW 我有两种情况,在第一种情况下,我知道数值将包含在值的双引号中的哪个字段。第二种情况,我不知道数值的位置。我如何实现这一目标?我正在尝试在 Unix Shell 脚本中使用它。有什么建议吗???
@Dhruuv 您可以使用 perl 正则表达式。请查看我的答案的最新更新。
【参考方案1】:
要删除引号(用不带引号的数字替换带引号的数字):
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
这将用不带引号的值替换引号内的所有数字
【讨论】:
嗨 Morja,您能解释一下您使用 perl 的代码吗?真的很感激...以上是关于从 .CSV 文件的数值中删除双引号和逗号的主要内容,如果未能解决你的问题,请参考以下文章