我在将 .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"
总体目标是:
- 以文本形式阅读此内容;
- 在引用完整的句子中添加逗号,并在不完整的行中添加换行符 (
\n
); - 将所有这些连接成一个连续向量;
- 提取文字
"
的所有序列,零个或多个非"
,然后是另一个"
; - 使用
矩阵
构造来构造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/