2015-10-02 21 views
9

Ho un file CSV di dimensioni ~ 1 GB e, poiché il mio laptop è di configurazione di base, non riesco ad aprire il file in Excel o R. Ma per curiosità, mi piacerebbe avere il numero di righe nel file. Come posso farlo, se posso farlo davvero. Grazie in anticipo.È possibile ottenere il numero di righe in un file CSV senza aprirlo?

+4

Forse solo 'wc -l yourfile.csv' da una riga di comando, o qualcosa del genere ? – joran

+2

Se la dimensione del file è 1 GB, dovresti riuscire a importarlo. Ovviamente, non dovresti farlo con 'read.table' e gli amici. Usa 'fread' dal pacchetto data.table. – Roland

+0

quindi stai dicendo che 'nrow (read.csv (" file.csv ", intestazione = T/F))' blocca R? E sì, 'fread' certamente ha preferito –

risposta

20

per Linux/Unix:

wc -l filename 

Per Windows:

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

Non sono sicuro della sua efficienza, ma qui è un approccio di base R. Tramite una connessione file, count.fields() conta il numero di campi per riga del file. Quindi, se prendiamo la lunghezza del risultato, teoricamente dovremmo finire con il numero di righe (righe) nel file.

length(count.fields(filename)) 

E se si dispone di una riga di intestazione, si può saltare con skip = 1

length(count.fields(filename, skip = 1)) 

Non ci sono altri argomenti che è possibile regolare per le vostre esigenze specifiche.

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

Vedere help(count.fields) per ulteriori informazioni.

Aggiornamento: Non è male per quanto riguarda la velocità. L'ho appena testato su uno dei miei file di baseball che contiene 99846 righe.

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 

Un'altra idea è quella di utilizzare data.table::fread() di leggere la prima colonna solo, poi prendere il numero di righe. Questo sarebbe molto veloce.

system.time(nrow(fread("Batting.csv", select = 1L))) 
# user system elapsed 
# 0.063 0.000 0.063 
Problemi correlati