解析坏的CSV

时间:2011-07-19 12:09:17

标签: parsing io

我有一个“坏”标签分隔文件,我需要清理。问题在于字段可能包含换行符。我认为解决这个问题的最简单方法是用某种替换字符替换“错误”的换行符,例如空格。现在我可以设想一种方法来做到这一点,如果一条线上应该有n个字段就是(伪代码)

var line = read n-1 fields ending in a tab, and then until the end of line
line.replace("\n", " ")
line.replace("\r", " ")
write line to output

现在这些文件非常庞大,并且不能选择它们。这是一种合理的方法吗? (我知道这会在最后一场比赛中超越阵容,但我愿意接受这一点) 什么是阅读足够数据的好方法?我不在乎它使用哪种语言,但更喜欢.net,perl或python2,因为我有可用的运行时。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

你可以用一个非常快速的awk脚本来做到这一点:

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

答案 2 :(得分:0)

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

我猜必须有一个与PC等效的程序。

CSV文件基本上是一天结束时的文本文件,因此您需要将驴工作从问题中解脱出来。