R我的代码在dir中循环文件有什么问题,并且替换

时间:2015-07-08 01:44:20

标签: r

我尝试重用一些同事给(和学习)的旧代码。读取带有.sql扩展名的路径中的所有文件并进行一些替换,然后以新名称写出或保存已编辑。 之后我仍然没有在我的名字和命令找不到路径,然后测试后我直接指向一些文件并得到一些错误。我全都在Windows机器上。

path = "c:/WorkDir/Alpha/"
out.file<-""
file.names <- dir(path, pattern =".sql")
for(i in 1:length(file.names)){
  file <- read.table(file.names[i])
 gsub( "Merry Christmas", "Happy New Year", file )
  out.file <- rbind(out.file, file)
  write.table(out.file, file = c(file,"new")
}

所以file.names显示像xxx.sql没有部分,是命令应该照顾??

非常感谢 中号

2 个答案:

答案 0 :(得分:1)

因此您的代码存在一些问题。 首先,gsub是一个函数,它返回您所做的替换结果。它不会在您在函数中传递的数据中进行替换。所以你应该保存结果并在以后使用它。

my_vec = c("Merry Christmas", "2015")
my_new_vec = gsub("Merry Christmas", "Happy New Year", my_vec)
print(my_vec)  #  [1] "Merry Christmas" "2015"
print(my_new_vec)  # [1] "Happy New Year" "2015"

然后,您应该确保正确设置了您的工作目录。 write.table会将您的文件“.sql”保存在工作目录中,以获取与您相关的链接。

getwd()  # the directory where write.table will write
setwd("c:/WorkDir/Alpha/")  # set the working directory

如果您需要绝对链接,可以使用file.path(请参阅?file.path

file.name = "myfile.sql"
abs_path = file.path("c:/WorkDir/Alpha/", file.name)
print(abs_path)  # [1] "c:/WorkDir/Alpha/myfile.sql"

最后,我不明白你想对rbind做什么,这对我没有意义。如果您想使用new替换相同的名称,请尝试使用粘贴功能。

尝试从此开始,并使用?setwd?rbind等滥用文档。

# Control your working directory
# use setwd() to change your working directory
print(paste("Working in ", getwd(), " directory")) 

path = "c:/WorkDir/Alpha/"
file.names <- dir(path, pattern =".sql")
for(file.name in file.names){
    file <- read.table(file.name)
    result.replacement = gsub("Merry Christmas", "Happy New Year", file)
    write.table(result.replacement, 
                file=paste(file.name, "new.sql", sep="_"))
}

<强>更新

由于您的数据是纯文本格式,因此您需要使用?readChar?writeChar来读取/写入数据。

library(tools)  # To get some information about paths
path = "c:/WorkDir/Alpha/"
file.names <- dir(path, pattern =".sql")
for(file.name in file.names){
    file.ext = file_ext(file.name)
    file.wthout_ext = file_path_sans_ext(file.name)

    file.content <- readChar(file.name, file.info(file.name)$size)
    result = gsub("Merry Christmas", 
                         "Happy New Year", 
                         file.content)

    writeChar(result, 
                con=paste(file.wthout_ext, "_new.", file.ext, sep=""))
}

答案 1 :(得分:1)

有很多方法可以做你想要的,但我担心你无法使用read.table函数读取.sql。另外,理想情况下,您的write.table应该被置于循环之外。如果您想将其保留在里面,则需要添加append = TRUE

path = "C:/WorkDir/Alpha/"
out.file<-""
file.names <- dir(path, pattern =".sql")
for(i in 1:length(file.names)){
gsub( "Merry Christmas", "Happy New Year", file )
  file <- read.table(file.names[i])
  out.file <- rbind(out.file, file)
}
 write.table(out.file, file = "yourBigFile.txt", row.names = FALSE, qmethod = "double")