0

我正在处理与其他帖子中所述类似的问题,并尝试调整代码以选择我感兴趣的列并使其适合我的数据文件。

但是,我的问题是生成的文件已经变得比原始文件大,而且我不确定代码是否按照我的预期工作。

当我用 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)
4

1 回答 1

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)

我无法在您的文件上测试上面的代码,所以不能保证没有错误(如果有,请告诉我)。

于 2013-07-19T14:07:06.697 回答