create a loop: convert .txt to .csv in R

a 夏天 提交于 2019-12-24 12:05:35

问题


I try to convert all my .txt files in .csv, but I didn't manage to create the loop. The actual line for one file (which works perfectly) would be the following:

tab = read.delim("name_file", header = TRUE, skip = 11)
write.table(tab, file="name_file.csv",sep=",",col.names=TRUE,row.names=FALSE)

And I would like to do that for all the .txt file I have in wd.

I tried the loop with, based on some reasearch on the web, but I am not sure it's the right one:

FILES = list.files(pattern = ".txt")
for (i in 1:length(FILES)) {
  FILES = read.csv(file = FILES[i], header = TRUE, skip = 11, fill = TRUE)
  write.csv(FILES, file = paste0(sub("folder_name", ".txt","", FILES[i]), ".csv"))
}

I'm on Windows system. I would appreciate some help... Thanks!


回答1:


Hi I have the same problem before just like you, and now I made it works. Try this:

directory <- "put_your_txt_directory_here"
ndirectory <- "put_your_csv_directory_here"

file_name <- list.files(directory, pattern = ".txt")

files.to.read <- paste(directory, file_name, sep="/") 
files.to.write <- paste(ndirectory, paste0(sub(".txt","", file_name),".csv"), sep="/")

for (i in 1:length(files.to.read)) {
  temp <- (read.csv(files.to.read[i], header = TRUE, skip = 11, fill = TRUE))
  write.csv(temp, file = files.to.write[i])
}



回答2:


You need to index the output inside the loop as well. Try this:

INFILES = list.files(pattern = ".txt")

OUTFILES = vector(mode = "character", length = length(INFILES))

for (i in 1:length(INFILES)) {
   OUTFILES[i] = read.csv(file = INFILES[i], header = TRUE, skip = 11, 
                    fill = TRUE)
   write.csv(OUTFILES[i], file = paste0("folder_name", sub(".txt","", INFILES[i]), ".csv"))
 }



回答3:


Assuming that your input files always have at least 11 rows (since you skip the first 11 rows!) this should work:

filelist = list.files(pattern = ".txt")

for (i in 1:length(filelist)) {
  cur.input.file <- filelist[i]
  cur.output.file <- paste0(cur.input.file, ".csv") 
  print(paste("Processing the file:", cur.input.file))

  # If the input file has less than 11 rows you will reveive the error message:
  # "Error in read.table: no lines available in input")
  data = read.delim(cur.input.file, header = TRUE, skip = 11)
  write.table(data, file=cur.output.file, sep=",", col.names=TRUE, row.names=FALSE)
}

If you reveive any error during file conversion it is caused by the content (e. g. unequal number of rows per column, unequal number of columns etc.).

PS: Using a for loop is OK here since it does not limit the performance (there is no "vectorized" logic to read and write files).



来源:https://stackoverflow.com/questions/35238391/create-a-loop-convert-txt-to-csv-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!