programing

CSV 파일을 열지 않고 CSV 파일의 행수를 취득할 수 있습니까?

golfzon 2023. 4. 19. 23:47
반응형

CSV 파일을 열지 않고 CSV 파일의 행수를 취득할 수 있습니까?

최대 1GB의 CSV 파일을 가지고 있는데 노트북이 기본 구성이기 때문에 Excel이나 R로 파일을 열 수 없습니다.다만, 궁금해서, 파일내의 행수를 알고 싶습니다.할 수 있다면 어떻게 해야 할까?

Linux/Unix의 경우:

wc -l filename

Windows 의 경우:

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

옵션 1:

파일 연결을 통해count.fields()파일의 한 줄당 필드 수를 카운트합니다.sep(여기서는 신경 쓰지 않는) 가치.따라서 이 결과의 길이를 계산하면 이론적으로 파일 내의 줄 수(및 행 수)로 끝납니다.

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줄이 들어있어서 테스트해봤어요.

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 

처음 1000줄의 크기에 따라 줄 수를 예측합니다.

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

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

이것은 보통 대부분의 목적에 적합하며 대용량 파일에도 훨씬 더 빠릅니다.

다음은 제가 사용한 것입니다.

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/

R에서 Tony의 답변 구현:

file <- "/path/to/file"
cmd <- paste("wc -l <", file)
as.numeric(system(cmd, intern = TRUE))

이 속도보다 약 4배 빠른 속도입니다.data.table10만 행의 파일에 대해

>     microbenchmark::microbenchmark(
+         nrow(fread("~/Desktop/cmx_bool.csv", select = 1L)),
+         as.numeric(system("wc -l <~/Desktop/cmx_bool.csv", intern = TRUE))
+     )
Unit: milliseconds
                                                               expr       min        lq
                 nrow(fread("~/Desktop/cmx_bool.csv", select = 1L)) 128.06701 131.12878
 as.numeric(system("wc -l <~/Desktop/cmx_bool.csv", intern = TRUE))  27.70863  28.42997
      mean   median        uq      max neval
 150.43999 135.1366 142.99937 629.4880   100
  34.83877  29.5070  33.32973 270.3104   100

언급URL : https://stackoverflow.com/questions/32913151/is-it-possible-to-get-the-number-of-rows-in-a-csv-file-without-opening-it

반응형