读取固定宽度的大数据
如何读取固定宽度的大数据?我读了
this的问题,并尝试了一些提示,但所有的答案都是分隔的数据(如.csv),这不是我的情况。数据有558MB,我不知道有多少行。
我在用着: dados <- read.fwf('TS_MATRICULA_RS.txt',width=c(5,13,14,3,5,4,6,1,2,9,11,1),stringsAsFactors=FALSE,comment.char='',colClasses=c('integer','integer','character','character'),buffersize=180000) 但需要30分钟(并计数…)才能读取数据。任何新建议? 解决方法
没有关于你的数据的详细信息,很难给出一个具体的答案,但这里有一些想法让你开始:
首先,如果您使用的是Unix系统,可以使用wc命令获取有关文件的一些信息。例如,wc -l TS_MATRICULA_RS.txt将告诉您文件中有多少行,而wc -L TS_MATRICULA_RS.txt将报告文件中最长行的长度。这可能是有用的知道。同样,头尾也可以让您检查文本文件的第一行和最后10行。 第二,一些建议:由于看起来你知道每个领域的宽度,我会推荐两种方法之一。 选项1:csvkit你最喜欢的方法来快速读取大数据 csvkit是一组用于处理CSV文件的Python工具。其中一个工具是 架构文件本身就是一个带有三列的CSV文件:(1)变量名,(2)起始位置和(3)宽度。一个例子(从in2csv手册页)是: column,start,length name,30 birthday,30,10 age,40,3 创建该文件后,您应该可以使用以下内容: in2csv -f fixed -s path/to/schemafile.csv path/to/TS_MATRICULA_RS.txt > TS_MATRICULA_RS.csv 从那里,我建议您查看从“data.table”或使用sqldf读取数据。 选项2:sqldf使用substr 在像你这样的大型数据文件中使用sqldf应该很快,而且您可以利用substr来准确指定要读取的内容。 再次,这将期望您有一个可用的模式文件,如上所述。一旦你有了架构文件,你可以执行以下操作: temp <- read.csv("mySchemaFile.csv") ## Construct your "substr" command GetMe <- paste("select",paste("substr(V1,",temp$start,temp$length,") `",temp$column,"`",sep = "",collapse = ","),"from fixed",sep = " ") ## Load "sqldf" library(sqldf) ## Connect to your file fixed <- file("TS_MATRICULA_RS.txt") myDF <- sqldf(GetMe,file.format = list(sep = "_")) 由于您知道宽度,您可以跳过生成模式文件。从宽度来看,这只是一个与cumsum有关的工作。这是一个基本的例子,它基于read.fwf的第一个例子: ff <- tempfile() cat(file = ff,"123456","987654",sep = "n") read.fwf(ff,widths = c(1,3)) widths <- c(1,3) length <- cumsum(widths) start <- length - widths + 1 column <- paste("V",seq_along(length),sep = "") GetMe <- paste("select",widths,column,sep = " ") library(sqldf) ## Connect to your file fixed <- file(ff) myDF <- sqldf(GetMe,file.format = list(sep = "_")) myDF unlink(ff) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |