2017-02-10 81 views
0

所以,我有形式的該輸入CSV,閱讀數字輸入作爲串R

id,No.,V,S,D 
1,0100000109,623,233,331 
2,0200000109,515,413,314 
3,0600000109,611,266,662 

我需要讀取號列,因爲它是(即,作爲一個字符)。我知道我可以使用像這樣爲:

data <- read.csv("input.csv", colClasses = c("MSISDN" = "character")) 

我有我用來讀取數據塊CSV文件中的代碼:

chunk_size <- 2 
con <- file("input.csv", open = "r") 
data_frame <- read.csv(con,nrows = chunk_size,colClasses = c("MSISDN" = "character"),quote="",header = TRUE,) 
header <- names(data_frame) 
print(header) 
print(data_frame) 
if(nrow(data_frame) == chunk_size) { 
repeat { 
data_frame <- read.csv(con,nrows = chunk_size, header = FALSE, quote="") 
names(data_frame)<-c(header) 
print(header) 
print(data_frame) 
if(nrow(data_frame) < chunk_size) { 
    break 
} 
} 
} 

close(con) 

但是,這裏的問題我」什麼m面對的是,第一個塊只會讀取作爲字符的Column列,其餘的塊不會。

我該如何解決這個問題?

PS:原始輸入文件有大約150列和大約2000萬行。

+0

你爲什麼要以塊讀取它? –

+0

你最後的'read.csv'不像其他兩個那樣使用'colClasses'。 –

+0

@Remko在最後的read.csv我不能添加colClasses,因爲我已經在該語句中設置了header = false。 – Raymond

回答

0

您需要在重複過程中的read.csv()中給出列類型colClasses。 您不再擁有標題,因此您需要定義未命名的向量來指定colClasses。 假設colClasses的尺寸爲150

myColClasses=rep("numeric",150) myColClasses[2] <- "character" repeat { data_frame <- read.csv(con,nrows = chunk_size, colClasses=myColClasses, header = FALSE, quote="") ...

+0

我提供的輸入是隻是一個樣本。原始文件包含約150列。那麼採用您的解決方案將非常困難。有其他方法嗎? – Raymond

0

可以讀取數據作爲字符串readLines並把它分解:

fileName <- "input.csv" 
df <- do.call(rbind.data.frame, strsplit(readLines(fileName), ",")[-1]) # skipping headlines 
colnames(df) <- c("id","No.","V","S","D") #adding headlines 

read.csv直接的方法:

fileName <- "input.csv" 
col <- c("integer","character","integer","integer","integer") 
df <- read.csv(file = fileName, 
       sep = ",", 
       colClasses=col, 
       header = TRUE, 
       stringsAsFactors = FALSE) 
+0

正如我在問題中已經提到的那樣,輸入文件包含大約150列,並且手動爲所有列標題手動輸入數據類型非常困難。 – Raymond

+0

在我的第一個代碼片段中,你不需要那個。列名(第三行)的更正也可以自動完成,例如。使用readLine – holzben