如何清理csv文件,其中字段包含csv分隔符和分隔符

时间:2015-08-08 17:19:26

标签: bash csv scripting

我目前正在努力清理使用sed或awk或脚本通过包含csv分隔符和字段分隔符的字段自动生成的csv文件。

源软件没有可用于改善情况的设置。

csv的格式:

"111111";"text";"";"text with ; and " sometimes "; or ;" multiple times";"user";

幸运的是,csv格式“井”,导出软件无法从字段中删除或替换“禁止”字符。

在过去的几天里,我试图提高我对正则表达式的了解并找到表达式来清理文件但是我失败了。

到目前为止我做了什么:

RegEx找到字段(我想找到字段并在里面执行替换,但我找不到办法做到这一点)

(?:";"|^")(.*?)(?=";"|";\n)

查找分号的RegEx,如果分号是该字段的最后一个字符,则每个字段只能找到一个分号。

(?:^"|";")(?:.*?)(;)(?:[^"\n].*?)(?=";"|";\n)

RegEx找到双引号,似乎在网上正则表达式测试者中选择该行的第一个双引号

(?:^"|";")(?:.*?)[^;](")(?:[^;].*?)(?=";"|";\n)

我想在字段中的每个字符之间添加空格然后搜索孤独的半冒号和双引号并在此之后删除单个空格但我不知道它是否可能并且看起来似乎是一个糟糕的解决方案。

1 个答案:

答案 0 :(得分:0)

如果CSV本身没有明确的错误,任何标准库都应该能够处理它。这就是为什么我们有引号字符和转义字符。

当您自己创建CSV时 - 您可能忘记处理此类情况并让最终输出文件使用这种情况。 AWK不是CSV阅读器,而只是文本处理实用程序。

这就是你的行应该是什么样子。

"111111";"text";"";"text with \; and \" sometimes \"; or ;\" multiple times";"user";

因此,如果您仍然可以重新获取数据,请找到一种方法,通过数据库自己的csv库功能导出CSV,用于您使用的语言。

在python中,这看起来像这样: -

mywriter = csv.writer(csvfile, delimiter=';', quotechar='"', escapechar="\\")

但是如果你不能再次创建csv,唯一的希望就是你希望字段中有一些模式,就像这个问题一样: - parse a csv file that contains commans in the fields with awk

但在文本数据中很少这样 - 尤其是网页上的评论或帖子。在这种情况下的另一个想法是使用'\ t'作为分隔符。