在 R 中,如何使用自定义行尾 (eol) 读取文件

In R, how to read file with custom end of line (eol)

我有一个文本文件要在 R 中读取(并存储在 data.frame 中)。该文件分为多行和多列。 "sep" 和 "eol" 都是自定义的。

问题:自定义eol,即“\t&nd”(不带引号),无法在read.table(...)(或read.csv(...)中设置, read.csv2(...),...) 也不在 fread(...) 中,我找不到解决方案。

我在这里搜索([r] 阅读 eol" 和其他我不记得的)但我没有找到解决方案:唯一的方法是预处理更改 eol 的文件(在我的情况是因为在某些字段中我可以找到类似 \n, \r, \n\r, ", ... 的内容,这就是定制的原因)。

谢谢!

您可以通过两种不同的方式解决这个问题:

一个。如果文件不是太宽,您可以使用 scan 读取所需的行并使用 strsplit 将其拆分为所需的列,然后合并为 data.frame。示例:

# Provide reproducible example of the file ("raw.txt" here) you are starting with
your_text <- "a~b~c!1~2~meh!4~5~wow"
write(your_text,"raw.txt"); rm(your_text)  

eol_str = "!" # whatever character(s) the rows divide on
sep_str = "~" # whatever character(s) the columns divide on

# read and parse the text file   
# scan gives you an array of row strings (one string per row)
# sapply strsplit gives you a list of row arrays (as many elements per row as columns)
f <- file("raw.txt")
row_list <- sapply(scan("raw.txt", what=character(), sep=eol_str), 
                   strsplit, split=sep_str) 
close(f)

df <- data.frame(do.call(rbind,row_list[2:length(row_list)]))
row.names(df) <- NULL
names(df) <- row_list[[1]]

df
#   a b   c
# 1 1 2 meh
# 2 4 5 wow

乙。如果 A 不起作用,我同意@BondedDust 的观点,即您可能需要一个外部实用程序——但您可以在 R 中使用 system() 调用它并执行 find/replace 以重新格式化文件 [=15] =].您的调用将特定于您的 OS。示例:https://askubuntu.com/questions/20414/find-and-replace-text-within-a-file-using-commands。既然你注意到你的文本中已经有 \n\r\n,我建议你首先找到它们并用临时占位符替换它们——也许是它们自己的引用版本——然后你可以转换它们建立 data.frame.

后返回