如何清理字段包含 csv 分隔符和定界符的 csv 文件
How to clean a csv file where fields contains the csv separator and delimiter
我目前正在努力清理使用 sed 或 awk 或通过脚本自动生成的包含 csv 分隔符和字段定界符的字段的 csv 文件。
源软件没有可用来改善情况的设置。
csv格式:
"111111";"text";"";"text with ; and " sometimes "; or ;" multiple times";"user";
幸运的是,csv 是 "well" 格式的,导出软件不会转义或替换字段中的 "forbidden" 个字符。
这几天我想提高正则表达式的知识,找表达式来清理文件,但我失败了。
到目前为止我做了什么:
RegEx 查找字段(我想查找字段并在其中执行替换,但我没有找到实现它的方法)
(?:";"|^")(.*?)(?=";"|";\n)
如果分号是字段的最后一个字符,则查找分号的 RegEx 不起作用,每个字段只能找到一个。
(?:^"|";")(?:.*?)(;)(?:[^"\n].*?)(?=";"|";\n)
RegEx 查找双引号,在在线正则表达式测试器中似乎选择了该行的第一个双引号
(?:^"|";")(?:.*?)[^;](")(?:[^;].*?)(?=";"|";\n)
我想在字段中的每个字符之间添加 space 然后搜索单独的分号和双引号并在之后删除单个 space 但我不知道它是否可能并且无论如何,这似乎是一个糟糕的解决方案。
如果 CSV 本身没有明确的错误,任何标准库都应该能够处理它。这就是为什么我们有引号字符和转义字符。
当您自己创建 CSV 时 - 您可能会忘记处理这种情况,而让您的最终输出文件使用这种情况。 AWK 不是 CSV reader,而只是一个文本处理实用程序。
您的行应该是这样的。
"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' 作为分隔符。
我目前正在努力清理使用 sed 或 awk 或通过脚本自动生成的包含 csv 分隔符和字段定界符的字段的 csv 文件。
源软件没有可用来改善情况的设置。
csv格式:
"111111";"text";"";"text with ; and " sometimes "; or ;" multiple times";"user";
幸运的是,csv 是 "well" 格式的,导出软件不会转义或替换字段中的 "forbidden" 个字符。
这几天我想提高正则表达式的知识,找表达式来清理文件,但我失败了。
到目前为止我做了什么:
RegEx 查找字段(我想查找字段并在其中执行替换,但我没有找到实现它的方法)
(?:";"|^")(.*?)(?=";"|";\n)
如果分号是字段的最后一个字符,则查找分号的 RegEx 不起作用,每个字段只能找到一个。
(?:^"|";")(?:.*?)(;)(?:[^"\n].*?)(?=";"|";\n)
RegEx 查找双引号,在在线正则表达式测试器中似乎选择了该行的第一个双引号
(?:^"|";")(?:.*?)[^;](")(?:[^;].*?)(?=";"|";\n)
我想在字段中的每个字符之间添加 space 然后搜索单独的分号和双引号并在之后删除单个 space 但我不知道它是否可能并且无论如何,这似乎是一个糟糕的解决方案。
如果 CSV 本身没有明确的错误,任何标准库都应该能够处理它。这就是为什么我们有引号字符和转义字符。
当您自己创建 CSV 时 - 您可能会忘记处理这种情况,而让您的最终输出文件使用这种情况。 AWK 不是 CSV reader,而只是一个文本处理实用程序。
您的行应该是这样的。
"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' 作为分隔符。