0

この他の投稿で述べられているように、私は同様の問題に取り組んでおり、コードを調整して、興味のある列を選択し、データファイルに適合させようとしました。

ただし、私の問題は、結果のファイルが元のファイルよりも大きくなっていることです。コードが意図したとおりに機能しているかどうかはわかりません。

SPSS で開くと、データセットはヘッダー行を取り込んだようで、2 行目の終わりなしで何百万ものコピーを作成しました (プロセスを強制的に停止する必要がありました)。

行を指定する while ループにカウンターがないことに気付きました。これは事実でしょうか? R を使ったプログラミングの経験は非常に限られています。ファイルは .csv で、329 の変数と数百万行を含む 4.8 GB です。約 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 ループ内に欠落しているという問題が 1 つあります。あなたは今、無限ループに陥っています。また、一度に 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)

上記のコードをあなたのファイルでテストできなかったため、エラーがないことを保証できません (エラーがある場合はお知らせください)。

于 2013-07-19T14:07:06.697 に答える