如何在R中读取含多行数据的格式混乱文本文件?
解决R中读取多行拆分数据的问题
问题背景
我有一个含17列的data.txt文本文件,用R的read.table()读取时遇到问题:部分数据行因文本字段(如推文内容)包含换行符,被拆分成了多行,导致读取错位。当前使用的代码是:
read.table(file="data.txt", header = TRUE, sep = "\t", quote = "",comment.char="")
示例拆分的行如下:
10 Macron serait-il plus pro-salafiste que Hamon?! t.co/g29oOgqih1 #Presidentielle2017 FALSE 0 NA 2017-03-02 13:45:08 FALSE NA 837297724378726400 NA <a href="https://about.twitter.com/products/tweetdeck" rel="nofollow">TweetDeck</a> Trader496 0 FALSE FALSE NA NA
想问有没有办法把这类拆分的行读取为完整单行,是否必须用fill=TRUE参数?
解决方案:无需用fill=TRUE,优先合并拆分的行
fill=TRUE会填充缺失列,但本质是把拆分的行当成独立数据行,会导致数据错位,不是最优解。推荐两种方法:
方法1:预处理文件,合并字段内的换行
核心思路是:先读取所有行,通过制表符数量判断哪些行是字段内的拆分(17列对应16个制表符),将这些拆分的行合并成完整行后再读取。代码示例:
# 读取所有行 all_lines <- readLines("data.txt") header_line <- all_lines[1] data_lines <- all_lines[-1] merged_data <- character(0) current_row <- "" for (line in data_lines) { # 统计当前行的制表符数量 tab_num <- sum(strsplit(line, "")[[1]] == "\t") current_row <- paste0(current_row, line) # 当当前行的制表符数达到16(对应17列),则作为完整行保存 if (tab_num >= 16) { merged_data <- c(merged_data, current_row) current_row <- "" } } # 处理最后一行可能的剩余内容 if (nchar(current_row) > 0) { merged_data <- c(merged_data, current_row) } # 读取合并后的完整数据 final_data <- read.table(text = c(header_line, merged_data), header = TRUE, sep = "\t", quote = "", comment.char = "")
方法2:使用readr包的read_tsv()函数
readr是tidyverse系列的包,其read_tsv()对字段内换行的处理更智能,无需手动预处理。安装并使用的代码:
install.packages("readr") library(readr) final_data <- read_tsv("data.txt", quote = "", comment = "", col_names = TRUE)
该函数会自动识别哪些换行属于字段内容,将拆分的行合并为完整数据行。
内容的提问来源于stack exchange,提问作者Night Fall
相关产品推荐
相关产品推荐

