我正在研究this other posting上所述的类似问题,并尝试调整代码以选择我感兴趣的列并使其适合我的数据文件。
然而,我的问题是生成的文件比原始文件大,我不确定代码是否按照我的意图运行。
当我使用SPSS打开时,数据集似乎占据了标题行,然后在没有第二行结束的情况下创建了数百万份副本(我必须强制停止该过程)。
我注意到while循环中没有指定行的计数器,可能是这种情况吗?我使用R编程的背景非常有限。该文件是.csv,是4.8GB,包含329个变量和数百万行。我只需要保留大约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)
答案 0 :(得分:1)
有一件事是错误的,它会在你的while循环中错过lines <- readLines(file.in, n=1)
。你现在陷入无限循环。此外,一次只读一行将会非常慢。
如果在您的文件中(与您链接的示例中的那个不同),每行包含相同数量的列,您可以使用我的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)
我无法在您的文件上测试上面的代码,因此无法保证没有错误(如果有,请告诉我)。