data.table::fread读取含换行符文本时解析异常求助
解决data.table::fread解析含字段内换行文本的列错位问题
你的问题根源在于fread默认将换行符视为行分隔符,而textProblem里的FullName字段包含了换行(Morgan Stanley Dean Witter Municipal Income Trust和CEF之间的空行),导致解析器错误地把这部分内容拆成了新行,最终出现列错位、字段匹配混乱的情况。
下面提供两种可行的解决方案:
方法1:预处理文本,替换字段内的换行符
既然字段内的换行是问题核心,我们可以先把文本里字段内部的换行符替换成空格(或其他不影响解析的字符),再用fread读取:
# 把textProblem中的所有换行符替换为空格 textProblemCleaned <- gsub("\\n+", " ", textProblem) # 读取处理后的文本 as.data.frame(data.table::fread(input=textProblemCleaned, sep=";", na.strings=c("Unassigned or n/a", "n/a", "{EMPTY}")))
处理后FullName字段会合并为Morgan Stanley Dean Witter Municipal Income Trust CEF,fread就能正常识别所有列的边界了。
方法2:用引号包裹含换行的字段(符合分隔符文本规范)
如果需要保留字段内的换行(你的场景里可能不需要,但这是更规范的处理方式),可以通过正则将包含换行的字段用引号括起来——分隔符文本中,字段内有换行时必须用引号包裹才能被正确解析:
# 用引号包裹第二个字段(FullName),匹配分隔符;之间的内容 textProblemQuoted <- gsub("(;)(.*?)(;)", "\\1\"\\2\"\\3", textProblem, perl=TRUE) # 读取带引号的文本,指定quote参数识别引号包裹的字段 as.data.frame(data.table::fread(input=textProblemQuoted, sep=";", quote="\"", na.strings=c("Unassigned or n/a", "n/a", "{EMPTY}")))
这种方式既能保留字段内的换行,又能让fread准确识别字段范围。
验证效果
处理后运行代码,你会看到textProblem的解析结果和textWorking完全一致:列名正确,所有字段都匹配到对应的列中,不会再出现错位问题。
内容的提问来源于stack exchange,提问作者Samo
相关产品推荐
相关产品推荐

