[我正在尝试在R中批量加载和合并两个CSV文件。我正在向数据框添加一列,以通过文件名在名为'file_name'的列中标识每个文件。
每个文件在顶部都有许多多余的行。最初我认为这是16行的一致模式。我利用read_csv函数中的“ skiprow”命令来解决该问题。
但是,在仔细检查后,我发现文件之间的16行模式不一致。我发现的唯一一致的模式是,每个文件中的所有“良好数据”都紧接在一行显示“与会者详细信息”之后]
我试图找出一种方法来跳过包含文本“与会者详细信息”的行之前的所有行,包括该行。
到目前为止是我的代码:
list_of_files <- list.files(pattern='*.csv')
df <- list_of_files %>%
setNames(nm = .) %>%
map_df(~read_csv(.x, col_types = cols(), col_names = FALSE), .id = "file_name")
我已经尝试过重新设计/配置在此线程中找到的代码片段-不幸的是,我遇到了错误,并且对从这里去哪里有些卡住。
Skip over all lines in a data file before and including a regular string in a loop in R
for (x in list.files(pattern="*.csv", recursive=TRUE)) {
all_content <- readLines(x)
skip = all_content[-c(1:grep("Attendee Details",all_content))]
input <- read.table(textConnection(skip))
df <- rbind(df, input)
}
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 1 did not have 13 elements
任何指针?另外,我知道最好在此处发布一个可复制的示例-我也不知道该怎么做。
1)作为指针:
df
? (cbind期望相同的列数,您显然在这里没有))cbind
之前将其排除在外,因此可能首先将它们读入列表中)fill = TRUE
)[这是data.table
的一种可能的解决方案,它也说明了一个可重现的示例(显然,可能未考虑您文件的详细信息:]
library(data.table) makeHeader <- function(x){ fn <- paste0("myfile_", sprintf("%02d", x), ".csv") cat("Attendee report\n", file=fn, append = FALSE) cat("Report Generated,01/01/2020\n", file=fn, append = TRUE) cat("Topic,topic ", x, "\n", file=fn, append = TRUE) cat("Attendee Details\n", file=fn, append = TRUE) } # generate files: set.seed(1) bigdt <- data.table(col1 = sample(1:12, 1.2e4, replace = TRUE), col2 = sample(LETTERS[1:26], 1.2e4, replace = TRUE), col3 = sample(20:50, 1.2e4, replace = TRUE)) biglist <- split(bigdt, ceiling(seq_len(dim(bigdt)[1])/1e3)) rm(bigdt) invisible(lapply(seq_along(biglist), makeHeader)) invisible(lapply(seq_along(biglist), function(x) fwrite(biglist[[x]], file=paste0("myfile_", sprintf("%02d", x), ".csv"), append=TRUE, col.names = TRUE))) # read files and combine; add column for file name files <- list.files(pattern="myfile_.*.csv") DT <- lapply(files, function(x) fread(x, skip="Attendee Details", sep=",")) names(DT) <- files rbindlist(DT, idcol = "file", fill=TRUE) #> file col1 col2 col3 #> 1: myfile_01.csv 9 N 48 #> 2: myfile_01.csv 4 V 33 #> 3: myfile_01.csv 7 X 22 #> 4: myfile_01.csv 1 W 49 #> 5: myfile_01.csv 2 X 34 #> --- #> 11996: myfile_12.csv 10 S 29 #> 11997: myfile_12.csv 5 T 25 #> 11998: myfile_12.csv 8 B 34 #> 11999: myfile_12.csv 11 P 43 #> 12000: myfile_12.csv 1 O 37
由reprex package(v0.3.0)在2020-05-31创建