读取文字档

时间:2018-07-10 21:34:27

标签: r

我想知道这段代码是否读取一组文本文件并以相同的名称重新保存它们。测试时,我发现在阅读阶段生成的列表为空。这是我的代码:

library('textreadr')
path <- ("C:/testnum/")
files <- list.files(path=path, pattern="*.txt") 
lines<-list()

for (i in 1:length(files)){
    lines[[i]] <- scan(files[i])
  }

lines[i]<-lapply(names(files), function(x) 
  writeLines(lines[x], file=paste(path, x, ".txt", sep = "")))

1 个答案:

答案 0 :(得分:1)

要纠正的几件事:

  • list.files返回一个未命名的character向量,因此names(files)将是NULL
  • list.files当前返回的是正义的文件名,而不是完整的文件读取路径,因此只有在工作目录中包含相同文件的情况下,您的scan调用才有效名字;最好采取防御措施,并将完整路径合并到文件名中
  • 您对lapply(files, function(i) writeLines(files[i], ...))的使用缺少了一点,即i是每个文件名,而不是向量的索引
  • scan如果给它一个文件名,则会执行自己的打开/关闭操作,因此我们可以在那里简化代码
  • writeLines返回NULL,不确定为什么要将它捕获到lines[i]中(如果i甚至具有有意义的值)
  • 您所使用的代码均不需要您要加载的任何软件包。不确定您是否假设需要此功能来使用它们,或者是否在其他地方使用它们(在这种情况下,它们不应成为问题)。

尝试一下:

path <- ("C:/Users/abidi/Desktop/testingSet/testnum/")
files <- list.files(path=path, pattern="*.txt", full.names=TRUE) 
lines <- sapply(files, scan, simplify=FALSE)

然后在忽略/丢弃输出时将其写出:

ign <- lapply(files, function(fn) writeLines(fn, paste0(fn, ".txt")))

最后一行可能更短

ign <- Map(writeLines, lines, paste0(files, ".txt"))

在两种情况下,ign仅仅是一个抛弃型变量:writeLines的返回值为NULL,因此您将拥有一个向量或{ {1}}个。

最后,我假设您正在对NULL的内容进行有意义的操作,介于读取它们并将它们重新写入新文件(具有 additional {{1 }},例如lines