跳过行,直到找到某些'值'-批量CSV上传,行号格式不一致

问题描述 投票:0回答:1

[我正在尝试在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") 

这是我的数据:What my data looks like

这是我希望为每个文件加载的内容,同时也跳过了该标题行:enter image description here

我已经尝试过重新设计/配置在此线程中找到的代码片段-不幸的是,我遇到了错误,并且对从这里去哪里有些卡住。

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

任何指针?另外,我知道最好在此处发布一个可复制的示例-我也不知道该怎么做。

r csv stringr read.table readr
1个回答
0
投票

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创建

© www.soinside.com 2019 - 2024. All rights reserved.