我需要从文本文件(其中许多和非常大)中读取数据,通常如下所示:
#2013#3090050010#CCOU#01#022#1#N#16/03/2015
#2013#3090050010#CCOU#01#023#1 ## 16/03/2015
#2013#3090050010#CCOU#02#005#1#1692528#16/03/2015
#2013#3090430110#CCOU#15#504#2#blablablablablablablablablablablablablab
labla第01/10/2014年
#2013#3090430110#CCOU#15#505#2 ## 01/10/2014年
所以“#”是分隔符,有时长记录使用两行.我有一个解决方法,我使用grep忽略不以“#”开头的行:
x<-readLines("data.txt")
y <- grep("^#",x)
app<-x[y]
NamesForCols<-c("..",...)
myDat<-read.table(text=app,header =F,sep="#",quote="",col.names = NamesForCols, colClasses=c("NULL", "factor", NA,NA,NA,NA,NA,"character","NULL"), fill=T,blank.lines.skip=T,comment.char = "",allowEscapes = T)
但我对这个解决方案不满意(重要数据丢失).有没有办法读取data.txt文件,以便每个记录必须准确地满足“#”符号8次,即使这意味着有时访问两行?任何其他建议都会受到欢迎.
谢谢!
最佳答案 您可以执行以下操作:
text <- "#2013#3090050010#CCOU#01#022#1#N#16/03/2015
#2013#3090050010#CCOU#01#023#1##16/03/2015
#2013#3090050010#CCOU#02#005#1#1692528#16/03/2015
#2013#3090430110#CCOU#15#504#2#blablablablablablablablablablablablablab
labla#01/10/2014
#2013#3090430110#CCOU#15#505#2##01/10/2014"
现在将不以#开头的列与前面的列组合在一起:
x <- strsplit(text, "\n")[[1]]
# starts with # or is empty
ind <- cumsum(pmax(grepl("^#",x), x==""))
x_collapsed <- vapply(split(x, ind), paste0, character(1), collapse = "")
x_collapsed <- paste(x_collapsed, collapse = "\n")
现在你可以阅读,例如通过:
require(readr)
read_delim(x_collapsed, delim = "#", col_names = FALSE,
col_types = cols(X9 = col_date("%d/%m/%Y")))[, -1]
结果如下:
# A tibble: 5 × 8
X2 X3 X4 X5 X6 X7 X8 X9
<int> <dbl> <chr> <chr> <chr> <int> <chr> <date>
1 2013 3090050010 CCOU 01 022 1 N 2015-03-16
2 2013 3090050010 CCOU 01 023 1 <NA> 2015-03-16
3 2013 3090050010 CCOU 02 005 1 1692528 2015-03-16
4 2013 3090430110 CCOU 15 504 2 blablablablablablablablablablablablablab labla 2014-10-01
5 2013 3090430110 CCOU 15 505 2 <NA> 2014-10-01