2017-02-10 3 views
0

Таким образом, у меня есть эта входная CSV формы,Read числового ввода в виде строки R

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

мне нужно прочитать No. столбец, как это (то есть., Как характер). Я знаю, что я могу использовать что-то вроде этого для этого:

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 - это то, что первый кусок будет читать только колонку № в качестве персонажа, остальные куски не будут.

Как я могу решить эту проблему?

PS: исходный файл ввода содержит около 150 столбцов и около 20 миллионов строк.

+0

Почему вы читаете его в кусках? –

+0

Ваш последний 'read.csv' не использует' colClasses', как два других. –

+0

@Remko в окончательном read.csv я не могу добавить colClasses, потому что я установил header = false в этом выражении. – Raymond

ответ

0

Вы должны дать тип столбца colClasses в read.csv() внутри повторения процедуры. У вас больше нет заголовка, поэтому вам нужно определить безымянный вектор, чтобы указать 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

Смежные вопросы