我尝试将带有列分隔符的文本表导入为' |'和行分隔符为" ----------"。我可以使用grep()和gsub()删除垂直条和短划线,但我无法弄清楚如何避免将编辑的行保存为临时对象。此代码有效:
foo <- gsub("|", " ",
grep("-------", readLines(
file("myfile", open="r")),
value=T, invert=T),
fixed=T)
the.con <- textConnection(foo, "r")
agency <- read.fwf(the.con, widths=dif.widths)
但如果我尝试在一行中完成整个事情而不保存临时对象&#34; foo&#34;那就失败了。
agency <- read.fwf(textConnection(
gsub("|", " ",
grep("-------", readLines(
file("myfile", open="r")),
value=T, invert=T),
fixed=T)), widths=dif.widths)
我收到此消息:
Error in textConnection(gsub("|", " ", grep("-------", readLines(file("myfile", :
argument 'object' must deparse to a single character string
我很难过。有人有什么想法吗?
答案 0 :(得分:1)
deparse(substitute(...))
执行一些myread <- function(filename, widths) {
tmp <- readLines(filename)
tmp <- grep("^[-]+$", tmp, value = TRUE, invert = TRUE)
tmp <- gsub("|", " ", tmp, fixed = TRUE)
con <- textConnection(tmp)
on.exit(close(con))
read.fwf(con, widths = widths)
}
agency <- myread("myfile", dif.widths)
魔术,将输入表达式转换为字符向量,并将其与调用环境一起传递给较低级别的C例程。这意味着您只能传递简单的表达式。
我不打算讨论,如果这是阅读文件的最佳方式,因为我不知道你文件中的内容,这不是你的问题。
首先,我不确定你为什么要避开临时对象。即使你没有明确地创建它们,R也会在执行你的代码时创建它们,所以你不会在性能方面获得任何好处。但是,您将获得难以阅读的代码。如果您想避免使用临时变量使您的环境混乱,可以将代码放入函数中:
file
在这里,我还避免了对创建文件连接的readLines
的不必要的调用,在您的示例中,之后不会关闭。将文件名直接传递给readLines
%>%
时,会为您打开并关闭连接。
如果您真的希望将所有内容放在一行并保持可读性,我会使用magrittr
中的library(magrittr)
agency <- readLines("myfile") %>%
grep("-----", ., value=TRUE, invert=TRUE) %>%
gsub("|", " ", ., fixed=TRUE) %>%
textConnection %>%
read.fwf(, widths = dif.widths)
运算符:
{{1}}
答案 1 :(得分:0)
如果列分隔符是“|”然后不要扔掉它们,使用它们。使用readLines
删除“行分隔符”作为初始输入,然后使用read.table
删除sep ="|"
。
inp <- readLines(con="file.nam")
inp <- inp[ !grepl(grep("-------", inp) ] # overwrite inp; drop "---------"
dat <- read.table(text=inp, sep="|")
否则,您可能会考虑使用scan
进行多行读取。如果你想要测试代码,你应该提供一个例子。
这是一种不在R工作区中创建临时文件的方法,而是使用awk
过滤掉-------
行:
inp <- read.table( pipe("awk '!/------/' '/full_path/to/fwftest.txt'"),
sep="|")