2017-01-18 74 views
1

我有大量要導入的文件,它們都保存爲zip文件。使用R中的動態名稱變量循環訪問文件

從閱讀其他文章似乎我需要通過壓縮文件的名稱,然後我想打開的文件的名稱。由於我有很多他們,我想我可以遍歷所有的文件並逐一導入它們。

是否有一種方法可以動態地傳遞名稱,或者是否有一種更簡單的方法來執行此操作?

這是我到目前爲止有:

Temp_Data <- NULL 
Master_Data <- NULL 


file.names <- c("f1.zip", "f2.zip", "f3.zip", "f4.zip", "f5.zip") 

for (i in 1:length(file.names)) { 
    zipFile <- file.names[i] 
    dataFile <- sub(".zip", ".csv", zipFile) 

    Temp_Data <- read.table(unz(zipFile, 
          dataFile), sep = ",") 

    Master_Data <- rbind(Master_Data, Temp_Data) 

} 

我收到以下錯誤:

dt <- read.table(unz("D:/f1.zip", "f1.csv"), sep = ",") 

我可以創建:

In open.connection(file, "rt") : 

我可以使用手動導入動態刺痛,但它感覺很長 - 當我用read.table(unz(...))包裝它時,它不起作用。這似乎無法找到的文件名等引發錯誤

cat(paste(toString(shQuote(paste("D:/",zipFile, sep = ""))),",", 
     toString(shQuote(dataFile)), sep = ""), "\n") 

但是,如果我再打印此控制檯我得到:

"D:/f1.zip","f1.csv" 

然後我就可以粘貼到`讀取。表(UNZ(....))和它的作品,所以我覺得像我靠近

我已經加了標籤,因爲這data.table是什麼我幾乎總是使用,所以如果它可以以「FREAD」來完成那太好了。

任何幫助表示讚賞

+0

'?fread'中的一個例子使用'system(「bunzip2 2008.csv.bz2」)'在讀入文件之前解壓縮文件。也許你應該添加一個類似的行。我建議在一個單獨的循環中執行此操作,但可以將其註釋掉並避免重複解壓縮相同的文件。 – lmo

+0

什麼是完整的錯誤信息和回溯?這可能是你的工作目錄或文件路徑的問題嗎? – Christoph

+0

@Christoph你是對的,這是我的wd問題,我正在用筆驅動器讀取 - 我是多麼愚蠢的檢查基礎知識!謝謝! – MidnightDataGeek

回答

2

可以使用list.files命令在這裏:

先設置你的工作目錄,其中所有文件都存儲有:

setwd("C:/Users/...") 

然後

file.names = list.files(pattern = "*.zip", recursive = F) 

那麼你的for循環將是:

for (i in 1:length(file.names)) { 
#open the files 

zipFile <- file.names[i] 
dataFile <- sub(".zip", ".csv", zipFile) 

Temp_Data <- read.table(unz(zipFile, 
         dataFile), sep = ",") 
# your function for the opened file 
Master_Data <- rbind(Master_Data, Temp_Data) 

#write the file finaly 
write_delim(x = Master_Data, path = paste(file.names[[i]]), delim = "\t", 
col_names = T)} 
+0

我有所有的文件名,我列舉他們只是一個例子。我想將文件名傳遞給我的循環中的'unz'函數,以便我可以遞歸地打開它們。 – MidnightDataGeek

+0

你終於將有一個Master_Data爲您的每個zip文件。那麼你需要用每個文件的唯一名稱將其寫入磁盤。你想要這個嗎?請再看看我的答案。我已經編輯過。 –

+0

謝謝,那是相當多我有什麼,但它原來有一個與我所用的筆式驅動器出了問題,對浪費你的時間,但感謝您的答覆道歉。 – MidnightDataGeek