读取 .txt 文件,其中列用引号分隔,行在 R 中多行

标签 r read.table

我在将 .txt 文件读取到 R 时遇到问题。它最后应该包含一个 id 列和一个 text 列。文件结构如下:

"", "textOriginal"
"1," "some text"
"2," "some text"
"3," "some text"

还有很多条目的文本被分成几行,如下所示:

"4," "some
      more
      text"

但是,我想避免 R 从第四个文本中生成三行,所以基本上我希望引号内的所有内容都位于具有各自 id 的一行中。我尝试了 read.table(mytext.txt), header = TRUE) 但没有得到所需的结果...

最佳答案

尝试这个技巧,从文本文件开始:

"", "textOriginal"
"1," "some text"
"2," "some text"
"3," "some text"
"4," "some
      more
      text"

代码:

quux <- readLines("quux.txt")
quux2 <- stringr::str_extract_all(paste(paste0(quux, ifelse(cumsum(nchar(gsub('[^"]', '', quux))) %% 2 == 0, ",", "\n")), collapse = ""), '"[^"]*"')[[1]]
quux2
#  [1] "\"\""                             "\"textOriginal\""                 "\"1,\""                          
#  [4] "\"some text\""                    "\"2,\""                           "\"some text\""                   
#  [7] "\"3,\""                           "\"some text\""                    "\"4,\""                          
# [10] "\"some\n      more\n      text\""

data.frame(matrix(quux2, ncol = 2, byrow = TRUE))
#     X1                             X2
# 1   ""                 "textOriginal"
# 2 "1,"                    "some text"
# 3 "2,"                    "some text"
# 4 "3,"                    "some text"
# 5 "4," "some\n      more\n      text"

总体目标是:

  1. 以文本形式阅读此内容;
  2. 在引用完整的句子中添加逗号,并在不完整的行中添加换行符 (\n);
  3. 将所有这些连接成一个连续向量;
  4. 提取文字 " 的所有序列,零个或多个非 ",然后是另一个 "
  5. 使用矩阵构造来构造data.frame。 (根据需要重命名。)

演练:

  • cumsum(nchar(..)) 计算一行中引号的数量。我们将其累积起来(例如,more 行被视为仍不完整。
  • ifelse(..) 根据 cumsum 是奇数(不完整引号)还是偶数(引号完整),附加换行符或逗号;
  • paste0(追加)到原始行;
  • 粘贴(连接)所有内容到一个字符串中;
  • 然后提取包含双引号的所有长度的字符串,一些(或没有)非引号,然后是另一个双引号。

如果需要,您可以使用以下方法清理它:

# quux3 <- ...above...
quux3[] <- lapply(quux3, gsub, pattern = '^"|\"$', replacement = '')
quux3
#   X1                           X2
# 1                    textOriginal
# 2 1,                    some text
# 3 2,                    some text
# 4 3,                    some text
# 5 4, some\n      more\n      text

关于读取 .txt 文件,其中列用引号分隔,行在 R 中多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72937924/

相关文章:

r - 将带有多字符分隔符的 "csv"文件导入到 R?

在R中读取具有多个空格和单词的文本文件

c# - 如何在 C# 中的 Winform 中嵌入 R 图?

用行值替换变量名,反之亦然

r - ggparty 和 tidymodels,无法绘制最终节点图,模型没有附加数据(?)

R read.csv 如何忽略回车?

r - 在循环中运行箱形图/水平线时,hline 索引没有改变的问题

r - 在循环中分配一个函数

r - R 中的 fread data.table 不读取列名

Read.csv 使一切都变得消极