从 .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 文件的数值中删除双引号和逗号的主要内容,如果未能解决你的问题,请参考以下文章

如果存在,则删除双引号之间的第一个逗号

我的 CSV 文件带有双引号括起来的字段 - 无法识别数值“12131”

opencsv写入时去掉双引号

正则表达式删除由双引号划定的 CSV 字段中的双引号

如何有条件地删除 R 中 write.csv 中的双引号

hive导入csv文件,字段中双引号内有逗号