Parsing 读取和解析大型.dat文件

Parsing 读取和解析大型.dat文件,parsing,large-data,Parsing,Large Data,我正试图解析一个4gb的大.dat文件。我试过用R,但时间太长了。是否有办法按段解析.dat文件,例如每30000行一次?任何其他解决办法也将受到欢迎。 这就是它看起来的样子: 以下是标题的前两行: ST|ZIPCODE | GEO|u ID | GEO|TTL | FOOTID|GEO | NAICS2012 | NAICS2012 | FOOTID|NAICS | YEAR | EMPSZES | EMPSZES|TTL | ESTAB | ESTAB | ESTAB | F 01 | 3

我正试图解析一个4gb的大.dat文件。我试过用R,但时间太长了。是否有办法按段解析.dat文件,例如每30000行一次?任何其他解决办法也将受到欢迎。 这就是它看起来的样子:

以下是标题的前两行: ST|ZIPCODE | GEO|u ID | GEO|TTL | FOOTID|GEO | NAICS2012 | NAICS2012 | FOOTID|NAICS | YEAR | EMPSZES | EMPSZES|TTL | ESTAB | ESTAB | ESTAB | F 01 | 35004 | 8610000US35004 | 35004MOODY,AL | 00 |所有部门总计| 2012 | 001 |所有机构| 167 |
01 | 35004 | 8610000US35004 | 35004MOODY,AL | | 00 |所有部门总计| | 2012 | 212 |有1到4名员工的机构| 91 |

这是使用data.table包中的fread函数在R中快速读取数据的一个选项

编辑

我删除了所有新行标记。这是已编辑的数据集

ST|ZIPCODE|GEO_ID|GEO_TTL|FOOTID_GEO|NAICS2012|NAICS2012_TTL|FOOTID_NAICS|YEAR|EMPSZES|EMPSZES_TTL|ESTAB|ESTAB_F
01|35004|8610000US35004|35004(MOODY,AL)||00|Total for all sectors||2012|001|All establishments|167| 
01|35004|8610000US35004|35004(MOODY,AL)||00|Total for all sectors||2012|212|Establishments with 1 to 4 employees|91| 
然后我将变量与类匹配。你应该使用nrows~100

然后我读取编辑后的数据

your_data <- fread(edited_data, sep="|", sep2=NULL, nrows=-1L, header=T, na.strings="NA",
        stringsAsFactors=FALSE, verbose=FALSE, autostart=30L, skip=-1L, select=NULL,
        colClasses=colclasses)
一切都很顺利。如果在删除标记时遇到问题,请使用此简单的Python脚本,这肯定需要一些时间:

original_file = file_path_to_original_file # e.g. "/Users/User/file.dat"
edited_file = file_path_to_new_file # e.g. "/Users/User/file_edited.dat"

with open(original_file) as inp:
    with open(edited_file, "w") as op:
        for line in inp:
            op.write(line.replace("<br/>", "")
附言


您可以使用read.table进行类似的优化,但它不会给您带来几乎相同的速度。

您的.dat文件中有什么?你能给我们讲几句话让我们了解一下结构吗。如果指定结构,可以显著提高R的读取速度。将所有内容分割成段并不能解决任何问题,dat是并且保持4GB。无论你如何扭曲或弯曲它。很抱歉,我没有回答你的问题,但我只是想指出这一点out@EliKorvigo我已经添加了该文件的一个片段。@Syntasu谢谢,现在我知道我的解决方案实际上不是一个解决方案:freadestabilizations_by_zip.dat中的错误,sep=|,sep2=NULL,nrows=-1L,:colClasses[[1]]中的列名“V1”未找到我得到以下错误。我不太清楚出了什么问题。我应该提前指定列名吗?请给出数据集的前两行,而不是屏幕截图。@peech从所有行中删除新行html标记。用标准符号\n替换它们。@peech我已编辑了我的答案,以便您可以重现我的操作。我没有遇到任何错误。
original_file = file_path_to_original_file # e.g. "/Users/User/file.dat"
edited_file = file_path_to_new_file # e.g. "/Users/User/file_edited.dat"

with open(original_file) as inp:
    with open(edited_file, "w") as op:
        for line in inp:
            op.write(line.replace("<br/>", "")