2011-07-19 58 views
1

我有一个“坏”选项卡分开的文件,我需要清理。问题在于田地可能有换行。我认为解决这个问题最简单的方法就是用一些替换字符替换错误的换行符,比如空格。现在我能想象的方式来做到这一点,如果有应该是在第n行的字段将是(伪)解析错误的CSV

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,因为我有可用的运行时。

+0

如果文件不是*可怕*大,我只是在Vim的做。如果是这样,那么我个人会用Python来做。你的方法对我来说似乎很好。 –

+0

以千兆字节为单位。我不寒而栗。 – Martijn

回答

1

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

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

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

我猜想必须有一个与PC相当的程序。

CSV文件基本上是一天结束时的文本文件,所以这就是你需要驴子工作的问题。

+0

我不明白为什么使用具有正则表达式搜索功能的全文本编辑器/ IDE具有编程方式读取它的优势。 TextWrangler可能会在大文件上挣扎(请参阅http://faq.barebones.com/do_getanswer.php?record_id=36) – Martijn

+0

我每天处理的数据上传数百万条记录,相信我这不是在处理平面文件时不常见。但是,差异非常明显。您已经编写,运行并检查程序的结果,并在文件中找不到错误所在的位置。文本编辑器(简单或复杂)可以加快分析过程,因为搜索功能完全是为了完成这项任务 - 而且您无需进行测试。它只是工作。在某些情况下,您可能只会谈论一两行或错误记录。 – T9b

+0

显然我不知道数据集的实际大小,或者CSV文件的创建方式。也许这是一个糟糕的脚本,从数据库中选择了一个?你不能修复提取脚本吗? – T9b

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 

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

+0

我不知道你打算如何处理这个文件,但是如果你打算进一步处理它,你可以用Python做,那么就不需要编写它。你可以使它成为一个生成器(把它放在函数中,而不是'writer.write(...)','yield ...'),并使用'csv'模块(delimiter ='\ t' )。 –

+0

感谢您的额外信息,但我只是需要发送它。 – Martijn

+0

@Martijn:为你工作吗? –