R / Sql / Other: работа с файлом Ragged Data Dump

У меня есть текстовый файл, разделенный запятыми, но в каждой строке нет одинакового количества полей. Первое поле имеет двухзначный код, который определяет, сколько полей будет в этой строке (это код, а не счет). Мне любопытно, есть ли какой-то стандартный метод для обработки таких данных для передачи их в среду 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 ГБ, поэтому я не могу открыть его в текстовом редакторе, чтобы манипулировать им. Первоначально я пытался прочитать его в R и разделить его на отдельные файлы, используя grep('^10,') или что-то в этом роде, но, похоже, есть проблема с кодировкой / разделителем, которую я пропускаю. Я предполагаю, что другие имели дело с подобной частью данных и были бы благодарны за любые предложения.

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, а не фреймы данных, потому что с таким большим файлом это будет быстрее.

Другие вопросы по тегам