如何快速查找目录中缺少第一行的所有文件?

时间:2017-09-27 16:21:12

标签: r data-import read.csv

我有一个.csv格式的文件夹。它们中有空白线是必要的(这表明没有来自LiDAR装置的测量,这是好的并且需要留在其中)。但偶尔,第一行是空的,这会抛出代码和包,一切都会中止。

现在我必须打开每个.csv并查看第一行是否为空。

我想做以下其中一项,但我不知道如何:

1)编写一个代码,快速扫描目录中的所有文件,并告诉我哪些文件缺少第一行

2)能够跳过仅在开头的空行 - 可能会有所不同,有时多行是空的

3)有一个循环遍历所有.csv文件的代码,并插入一个虚拟的第一行数字,这样所有导入的文件都没有问题。

谢谢!

2 个答案:

答案 0 :(得分:2)

这里有一些代码可以执行上面的1和2。我不确定为什么你想要插入虚线,因为能够做1和2;它很容易做到,但通常修改原始数据文件并不是一个好主意。

# Create some test files
cat("x,y", "1,2", sep="\n", file = "blank0.csv")
cat("", "x,y", "1,2", sep="\n", file = "blank1.csv")
cat("", "", "x,y", "1,2", sep="\n", file = "blank2.csv")


files <- list.files(pattern = "*.csv", full.names = TRUE)

for(i in seq_along(files)) {
  filedata <- readLines(files[i])
  lines_to_skip <- min(which(filedata != "")) - 1
  cat(i, files[i], lines_to_skip, "\n")
  x <- read.csv(files[i], skip = lines_to_skip)
}

打印

1 ./blank0.csv 0 
2 ./blank1.csv 1 
3 ./blank2.csv 2 

并正确读入每个数据集。

答案 1 :(得分:1)

我相信以下两个功能可以做你想要/需要的功能 首先,确定第二行空白文件的函数。

/people
/people?sex=female
/people?ageOver=30
/people?sex=female&ageOver=30

然后,一个函数用于读取具有这样的行的文件,一次一个。请注意,我假设第一行是列标题,并且至少第二行留空。有一个点参数second_blank <- function(path = ".", pattern = "\\.csv"){ fls <- list.files(path = path, pattern = pattern) second <- sapply(fls, function(f) readLines(f, n = 2)[2]) which(nchar(gsub(",", "", second)) == 0) } ,您可以将其他参数传递给...,例如read.table

stringsAsFactors = FALSE

现在,使用示例。

skip_blank <- function(file, ...){
    header <- readLines(file, n = 1)
    header <- strsplit(header, ",")[[1]]
    count <- 1L
    while(TRUE){
        txt <- scan(file, what = "character", skip = count, nlines = 1)
        if(nchar(gsub(",", "", txt)) > 0) break
        count <- count + 1L
    }
    dat <- read.table(file, skip = count, header = TRUE, sep = ",", dec = ".", fill = TRUE, ...)
    names(dat) <- header
    dat
}