2017-02-10 82 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