R有时在两行上读取带有记录的数据

标签 r read.table

我需要从文本文件(其中很多而且非常大)中读取数据,通常如下所示:

#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#blablablablablablablablablablablablablablab
拉布拉#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

关于R有时在两行上读取带有记录的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41465846/

相关文章:

Rscript 与源 : What are the key differences?

r - 使用 rvest(抓取)包然后清理文本

r - 将 R 中的多个列组合成一个新的向量列(最好是 tidyr 解决方案)

read.table() 错误,即使所有元素都存在

r - read.table将“T”读为TRUE,将“F”读为FALSE,如何避免?

r - 有没有办法生成类似于 mutate_at 或 mutate_if 的 Gather_at 或 Gather_if 函数

r - 如何根据 R 中的时间矩阵对点进行排序?

直接从 R 读取 .dat 和 .dct

R 中的 read.table 函数删除元素

读取以 "##"开头的注释行的表