web-dev-qa-db-ja.com

CSVファイルを開かずに行数を取得することは可能ですか?

サイズが〜1 GBのCSVファイルがあり、ラップトップは基本構成であるため、ExcelまたはRでファイルを開くことができません。しかし、好奇心から、行数を取得したいファイル。できるなら、どうすればいいですか?

19
Ohhm Prakash

Linux/Unixの場合:

wc -l filename

Windowsの場合:

find /c /v "A String that is extremely unlikely to occur" filename
32
Tony Ruth

オプション1:

ファイル接続を通じて、count.fields()sep値(ここでは関係ない)に基づいて、ファイルの1行あたりのフィールド数をカウントします。したがって、その結果の長さを取得する場合、理論的にはファイル内の行(および行)の数で終わる必要があります。

_length(count.fields(filename))
_

ヘッダー行がある場合は、_skip = 1_でスキップできます

_length(count.fields(filename, skip = 1))
_

空白行のスキップなど、特定のニーズに合わせて調整できる引数は他にもあります。

_args(count.fields)
# function (file, sep = "", quote = "\"'", skip = 0, blank.lines.skip = TRUE, 
#     comment.char = "#") 
# NULL
_

詳細については、help(count.fields)を参照してください。

速度に関してはそれほど悪くはありません。 99846行を含む野球ファイルの1つでテストしました。

_nrow(data.table::fread("Batting.csv"))
# [1] 99846

system.time({ l <- length(count.fields("Batting.csv", skip = 1)) })
#   user  system elapsed 
#  0.528   0.000   0.503 

l
# [1] 99846
file.info("Batting.csv")$size
# [1] 6153740
_

(より効率的な)オプション2:別のアイデアは、data.table::fread()を使用して最初の列のみを読み取り、行数を取得することです。これは非常に高速です。

_system.time(nrow(fread("Batting.csv", select = 1L)))
#   user  system elapsed 
#  0.063   0.000   0.063 
_
21
Rich Scriven

最初の1000行のサイズに基づいて行数を見積もる

size1000  <- sum(nchar(readLines(con = "dgrp2.tgeno", n = 1000)))

sizetotal <- file.size("dgrp2.tgeno")
1000 *  sizetotal / size1000

これは通常、ほとんどの目的には十分であり、巨大なファイルの場合ははるかに高速です。

2
pallevillesen

ここに私が使用したものがあります:

testcon <- file("xyzfile.csv",open="r")
readsizeof <- 20000
nooflines <- 0
( while((linesread <- length(readLines(testcon,readsizeof))) > 0 ) 
nooflines <- nooflines+linesread )
close(testcon)
nooflines

詳細については、この投稿をご覧ください: https://www.r-bloggers.com/easy-way-of-determining-number-of-linesrecords-in-a-given-large-file-using-r /

2
Narahari B M