2013-07-19 124 views
0

我在一个类似的问题的工作作为this other posting指出,并试图适应代码选择我感兴趣的列,使之适合我的数据文件。修剪大数据

我的问题,然而,就是生成的文件已经变得比原来的大,我不知道该代码工作我打算的方式。

当我用SPSS打开,该数据集似乎已经采取的标题行,然后赚了几百万份未经第二行结束(我不得不强制停止进程)。

我注意到有一个在while循环没有专柜,指定的路线,可能是这种情况?我用R编程的背景非常有限。该文件是一个.csv文件,具有329个变量和数百万行,为4.8GB。我只需要保留大约30个变量。

这是我使用的代码:

##Open separate connections to hold cursor position 

file.in <- file('npidata_20050523-20130707.csv', 'rt') 
file.out<- file('Mainoutnpidata.txt', 'wt') 
line<-readLines(file.in,n=1) 
line.split <-strsplit(line, ',') 

##Column picking, only column 1 

cat(line.split[[1]][1:11],line.split[[1]][23:25], line.split[[1]][31:33], line.split[[1]][308:311], sep = ",", file = file.out, fill= TRUE) 

##Use a loop to read in the rest of the lines 
line <-readLines(file.in, n=1) 
while (length(line)){ 
    line.split <-strsplit(line, ',') 
if (length(line.split[[1]])>1) { 
     cat(line.split[[1]][1:11],line.split[[1]][23:25], line.split[[1]][31:33], line.split[[1]][308:311],sep = ",", file = file.out, fill= TRUE) 
    } 
} 
close(file.in) 
close(file.out) 

回答

1

一件事不对的跳出它是您遗漏了lines <- readLines(file.in, n=1) while循环中。你现在陷入了一个无限循环。另外,一次只读一行的速度会非常慢。

如果在您的文件中(与链接的示例不同),每行都包含相同数量的列,则可以使用我的LaF软件包。这将导致沿着线的东西:

library(LaF) 
m <- detect_dm_csv("npidata_20050523-20130707.csv", header=TRUE) 
laf <- laf_open(m) 
begin(laf) 
con <- file("Mainoutnpidata.txt", 'wt') 
while(TRUE) { 
    d <- next_block(laf, columns = c(1:11, 23:25, 31:33, 308:311)) 
    if (nrow(d) == 0) break; 
    write.csv(d, file=con, row.names=FALSE, header=FALSE) 
} 
close(con) 
close(laf) 

如果你的30列装入内存,你甚至可以这样做:

library(LaF) 
m <- detect_dm_csv("npidata_20050523-20130707.csv", header=TRUE) 
laf <- laf_open(m) 
d <- laf[, c(1:11, 23:25, 31:33, 308:311)] 
close(laf) 

我无法测试上面的代码在你的文件,这样可以不保证没有错误(请告诉我是否有错误)。