R / Sql / Other:处理Ragged Data Dump文件

时间:2014-10-08 23:55:59

标签: sql r ragged

我有一个逗号分隔的文本文件,但每行没有相同数量的字段。第一个字段有一个2位数的代码,用于确定该行中的字段数(它不是计数的代码)。我很好奇是否有某种标准方法来处理这种数据以使其进入SQL环境。

文件如下所示:

10,abc,20141001,test@test.com,555-555-5555
20,abc,20141001,123 Main St,Springfield,CT,10001
10,xyz,20141001,test2@test.com,111-111-1111
...

此外文件大约为12 GB,因此我无法在文本编辑器中打开它来操作它。我最初尝试将其读入R并使用grep(' ^ 10,')或类似的东西将其拆分为单独的文件,但似乎缺少编码/分隔符问题。我假设其他人处理了类似的数据,并希望得到任何建议。

1 个答案:

答案 0 :(得分:1)

假设代码是一致的 - 例如编码10的行都以相同的方式格式化,你可以这样做:

text <- "10,abc,20141001,test@test.com,555-555-5555
20,abc,20141001,123 Main St,Springfield,CT,10001
10,xyz,20141001,test2@test.com,111-111-1111"

library(data.table)
conn <- textConnection(text)
result.10 <- do.call(rbind,lapply(1:3,function(i){
  x=readLines(conn,n=1)
  if(grepl("^10,",x)) return(setNames(strsplit(x,",")[[1]],c("code","name","date","email","phone")))
#  if(grepl("^20,",x)) return(setNames(strsplit(x,",")[[1]],c("code","name","date","address","city","state","zipcode")))
}))
result.10 <- as.data.table(result.10)
result.10[,code:=NULL]
result.10
#    name     date          email        phone
# 1:  abc 20141001  test@test.com 555-555-5555
# 2:  xyz 20141001 test2@test.com 111-111-1111

然后为result.20等做同样的事情然后你必须将文件合并为一个,可能是基于名称(可能是日期??),例如:

setkey(result.10,name,date)
setkey(result.20,name,date)
result <- merge(result.10,result.20,all.x=TRUE,all.y=TRUE)
result
#    name     date          email        phone     address        city state zipcode
# 1:  abc 20141001  test@test.com 555-555-5555 123 Main St Springfield    CT   10001
# 2:  xyz 20141001 test2@test.com 111-111-1111          NA          NA    NA      NA

我使用的是data.tables而不是数据框,因为有这么大的文件,它可能会更快。