2014-10-20 23 views
6

我希望將csv文件導入到R中,第一個非空行提供數據幀列的名稱。我知道你可以提供skip = 0參數來指定首先讀取哪一行。但是,第一個非空行的行號可以在文件之間更改。跳過read.csv中的所有主要空行

如何確定有多少行是空的,併爲每個文件動態跳過它們?

正如評論中指出的,我需要澄清一下「空白」的含義。我的csv文件如下所示:

,,, 
w,x,y,z 
a,b,5,c 
a,b,5,c 
a,b,5,c 
a,b,4,c 
a,b,4,c 
a,b,4,c 

這意味着在開始處有逗號的行。

回答

7

read.csv開始我自動跳過空白行(除非你設置blank.lines.skip=FALSE)。請參閱?read.csv

寫完上面的內容後,海報解釋說空白行實際上不是空白的,但在它們中間有逗號,但逗號之間沒有空格。在這種情況下,使用fread從data.table包處理。該skip=參數可以被設置爲在標頭中找到的任何字符串:

library(data.table) 
DT <- fread("myfile.csv", skip = "w") # assuming w is in the header 
DF <- as.data.frame(DT) 

最後一行可以如果data.table是確定作爲返回值被省略。

+1

良好的漁獲物。只要「空白」行完全沒有任何字符,這應該只是工作。 OP應該可以澄清他們的數據的性質。 – thelatemail 2014-10-20 00:25:57

+0

我確實嘗試過使用'blank.lines.skip = TRUE',我想知道爲什麼它不起作用。事實證明,空行包含逗號。 – Alex 2014-10-20 01:09:54

+0

在演奏中是否有跳過空行的減號? - - 我的每一行都是空的,實際上每一行都是空白的。 - - 我希望儘可能保持原始數據。 – 2016-11-05 14:12:45

2

根據您的文件大小,這可能不是最好的解決方案,但會完成這項工作。

這裏的策略不是讀取帶分隔符的文件,而是讀取行 並計數字符並存儲到臨時文件中。 然後,while循環將搜索列表中的第一個非零字符長度,然後 將讀取該文件,並將其存儲爲data_filename。

flist = list.files() 
for (onefile in flist) { 
    temp = nchar(readLines(onefile)) 
    i = 1 
    while (temp[i] == 0) { 
    i = i + 1 
    } 
    temp = read.table(onefile, sep = ",", skip = (i-1)) 
    assign(paste0(data, onefile), temp) 
} 

如果文件中包含標題,您可以從2

2

如果第一對空行確實是空的,那麼read.csv應該自動跳到第一行。如果他們有逗號,但沒有值,那麼你可以使用:

df = read.csv(file = 'd.csv') 
df = read.csv(file = 'd.csv',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 

這不是有效的,如果你有大量的文件(因爲你必須輸入兩次),但它的作品。

如果要導入同樣的問題(可變空行)製表符分隔的文件,然後使用:

df = read.table(file = 'd.txt',sep='\t') 
df = read.table(file = 'd.txt',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 
+0

現在與逗號,但這也會與標籤分離以及右? – Alex 2014-10-20 01:13:45

+0

不具有'read.csv'功能。由於該函數正在查找逗號,您將會看到一個錯誤。 – CephBirk 2014-10-20 02:47:36