如何在读取CSV时跳过行直至首列出现'Date Time'?
实现自动定位表头行读取CSV文件
要实现跳过行直到检测到首列列名为'Date Time'的行再读取数据,可以先逐行扫描文件定位目标行,再读取数据。具体操作如下:
- 先用
readLines()读取整个文件的所有行,避免提前解析为数据框。 - 遍历每行内容,拆分后检查首元素是否为'Date Time',记录对应的行号。
- 用
read.csv()读取时,设置skip为目标行号减1(跳过前面所有无关行),并将目标行作为表头。
修改后的代码如下:
# Read troll data in trollFiles <- list.files(pattern="_2019.csv") dataList <- list() baroList <- list() for (var in trollFiles) { filepath <- file.path(var) fileName <- substr(var, 1, nchar(var)-4) # 定位包含'Date Time'的表头行 all_lines <- readLines(filepath) skip_rows <- 0 for (i in seq_along(all_lines)) { line_parts <- strsplit(all_lines[i], "\\s+")[[1]] if (length(line_parts) > 0 && line_parts[1] == 'Date Time') { skip_rows <- i - 1 break } } # 从目标表头行开始读取数据 file <- read.csv(filepath, sep="", header=TRUE, check.names=FALSE, skip=skip_rows) colnames(file) <- c('DateTime', 'Pressure', 'Temperature') file$Pressure <- as.numeric(file$Pressure) file$Temperature <- as.numeric(file$Temperature) # 分类存入对应列表 if (fileName == 'baro_2019') { baroList[[fileName]] <- file } else { dataList[[fileName]] <- file } }
补充说明
strsplit(all_lines[i], "\\s+")用正则匹配任意空白字符拆分行内容,和read.csv(sep="")的行为一致,确保拆分规则统一。- 如果文件中不存在'Date Time'行,代码会保持
skip_rows=0直接读取第一行,可根据需求添加错误提示逻辑。 - 原代码中
file.path(paste(var))简化为file.path(var),单参数时file.path直接返回目标路径。
内容的提问来源于stack exchange,提问作者Melanie Baker
相关产品推荐
相关产品推荐

