2016-02-06 73 views
1

我尝试转换.csv中的所有.txt文件,但我没有设法创建循环。 一个文件(完美的作品)的实际行应为以下几点:创建一个循环:将.txt文件转换为.csv R

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

而且我想这样做,对于所有.txt文件我在WD。

我试图与循环的基础上,在网络上的一些reasearch,但我不知道这是正确的:

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")) 
} 

我的Windows系统上。 我将不胜感激,谢谢!

回答

0

您还需要为循环内的输出建立索引。试试这个:

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")) 
} 
+0

谢谢你快速的回答! 虽然它告诉我它没有找到OUTFILES对象......所以我应该在之前以某种方式定义它,对吧? – AndaZ

+0

你说得对。检查我所做的编辑。这应该解决它。 – Antti

+0

现在我收到另一个错误。也许我的文本文件存在问题?那可能是因为他们没有相同的行数? 'data.frame中的错误(c(122L,193L,194L,4L,14L,15L,21L,32L,33L,43L,: 自变量意味着行数不同:203,206' – AndaZ

0

假设你输入始终文件至少有11行(因为你跳过第11行!)这应该工作:

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) 
} 

如果文件转换过程中reveive任何错误它是由内容引起的(例如,每列的行数不等,列数不等)。 PS:在这里使用for循环是可以的,因为它不限制性能(没有“向量化”逻辑来读写文件)。

+0

谢谢@R尤达!事实上,我的原始文件在第12行开始标题。这就是为什么我想删除第11行。当我为一个文件完成时,它完美运行,但我无法一次找到如何为所有文件执行此操作。 安蒂用他的台词帮助我,我得到了csv文件,但没有划界。 – AndaZ

+0

@AndaZ很高兴听到安蒂可以帮助你。请将他的答案标记为“已接受”。 “不是划界”是什么意思? –

1

嗨我有像你一样的问题,现在我做了它的工作。试试这个:

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]) 
}