Parsing 解析错误的CSV

Parsing 解析错误的CSV,parsing,io,Parsing,Io,我有一个“坏”标签分开的文件,我需要清理。问题在于字段可能有换行符。我认为最简单的解决方法是用某种替换字符(比如空格)替换“错误”的换行符。现在我可以想象这样做的方法,如果一行上有n个字段,那么应该是(伪代码) 现在,这些文件非常庞大,不能对它们进行SLURP。这是否合理的做法?(我知道这会在最后一场比赛中被断线绊倒,但我愿意接受) 什么是读取足够数据的好方法?我不太关心它使用哪种语言,但更喜欢.net、perl或python2,因为我有可用的运行时 我不确定这是否是问这个问题的合适论坛,但你需

我有一个“坏”标签分开的文件,我需要清理。问题在于字段可能有换行符。我认为最简单的解决方法是用某种替换字符(比如空格)替换“错误”的换行符。现在我可以想象这样做的方法,如果一行上有n个字段,那么应该是(伪代码)

现在,这些文件非常庞大,不能对它们进行SLURP。这是否合理的做法?(我知道这会在最后一场比赛中被断线绊倒,但我愿意接受)
什么是读取足够数据的好方法?我不太关心它使用哪种语言,但更喜欢.net、perl或python2,因为我有可用的运行时

我不确定这是否是问这个问题的合适论坛,但你需要一个文本编辑器程序,比如TextWrangler(适用于Mac OSX)。这可以处理大型数据集,并进行一些非常复杂的搜索和替换

我想一定有一个相当于PC的程序

CSV文件基本上是一天结束时的文本文件,所以这就是你需要解决的问题

Python解决方案:

csv_filename = 'foo.csv'
new_csv_filename = 'foo.fixed.csv'
num_fields = 10

with open(csv_filename, 'rU') as reader and open(new_csv_filename, 'w') as writer:
    while True:
        line = ''
        while len(line.split('\t')) < num_fields:
            line += reader.readline().replace('\n', ' ')
        writer.write(line + '\n')  # Or '\r\n' if you prefer
csv\u文件名='foo.csv'
新的\u csv\u文件名='foo.fixed.csv'
num_字段=10
以open(csv_文件名,'rU')作为读卡器,以open(new_csv_文件名,'w')作为写卡器:
尽管如此:
行=“”
而len(line.split('\t'))

我不会自动替换文件;请确保保留原稿。

您可以通过一个非常快速的awk脚本来完成此操作:

awk -F\t '{while(NF < (numberoffields) { line=$0; getline; $0 = line $0;} print}' 
awk-F\t'{while(NF<(numberofields){line=$0;getline;$0=line$0;}print}'

如果文件不是非常大,我就用Vim来做。如果是,我个人会用Python来做。你的方法对我来说很好。以GB为单位。我一想到要把它弄脏就不寒而栗。我不明白为什么使用带有regex搜索功能的全功能文本编辑器/IDE比用程序来阅读它有任何优势TextWrangler也可能在处理大文件时遇到困难(请参阅)我每天处理数据上传,加载数百万条记录,相信我,这在处理平面文件时并不少见。但是,区别非常明显。你已经在一个无法确定错误所在的文件上编写、运行和检查程序结果。文本编辑器(简单或复杂)可以加快分析过程,因为搜索功能正是为这项任务而设计的,您无需进行测试。它只起作用。在某些情况下,您可能只谈论一行或两行或错误记录。显然,我不知道数据集的实际大小,也不知道CSV文件是如何创建的。可能这是一个错误的脚本从数据库中选择ook?您不能修复提取脚本吗?我不知道您打算如何处理该文件,但如果您打算进一步使用它(可以在Python中使用),则无需编写它。您可以将其作为生成器(将其放在函数中,而不是
writer.write(…)
产生…
),并使用
csv
模块(分隔符='\t')使用它.谢谢你提供的额外信息,但我只需要把它送走。不幸的是,我昨天没有时间测试它。这个答案看起来显然是正确的,但是awk脚本要简洁得多。如果这个对我有效,我会接受它,否则我会接受你的。
awk -F\t '{while(NF < (numberoffields) { line=$0; getline; $0 = line $0;} print}'