我有一个.csv格式的文件夹。它们中有空白线是必要的(这表明没有来自LiDAR装置的测量,这是好的并且需要留在其中)。但偶尔,第一行是空的,这会抛出代码和包,一切都会中止。
现在我必须打开每个.csv并查看第一行是否为空。
我想做以下其中一项,但我不知道如何:
1)编写一个代码,快速扫描目录中的所有文件,并告诉我哪些文件缺少第一行
2)能够跳过仅在开头的空行 - 可能会有所不同,有时多行是空的
3)有一个循环遍历所有.csv文件的代码,并插入一个虚拟的第一行数字,这样所有导入的文件都没有问题。
谢谢!
答案 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
}