加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

读取固定宽度的大数据

发布时间:2020-12-14 04:48:12 所属栏目:大数据 来源:网络整理
导读:如何读取固定宽度的大数据?我读了 this的问题,并尝试了一些提示,但所有的答案都是分隔的数据(如.csv),这不是我的情况。数据有558MB,我不知道有多少行。 我在用着: dados - read.fwf('TS_MATRICULA_RS.txt',width=c(5,13,14,3,5,4,6,1,2,9,11,1),string
如何读取固定宽度的大数据?我读了 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工具。其中一个工具是in2csv,它采用固定宽度格式的文件与“架构”文件组合,以创建可与其他程序一起使用的正确的CSV。

架构文件本身就是一个带有三列的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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读