2015-06-01 13 views
10

Come posso verificare la dimensione di un file prima di caricarlo in R?Come verificare la dimensione del file prima dell'apertura in R

Ad esempio:

http://math.ucdenver.edu/RTutorial/titanic.txt

mi piacerebbe utilizzare il comando ottimale per aprire un file in base alla dimensione del file.

+2

'file.info' è probabilmente quello che si vuole. – cory

+0

https://stackoverflow.com/questions/20921593/how-to-determine-the-file-size-of-a-remote-download-without-reading-the-entire-f è probabilmente quello che vuoi –

risposta

5
library(RCurl) 
url = "http://math.ucdenver.edu/RTutorial/titanic.txt" 
xx = getURL(url, nobody=1L, header=1L) 
strsplit(xx, "\r\n") 
+0

molto bello, grazie – Rhodo

13

Usa file.info()

file.info("data/ullyses.txt") 

        size isdir mode    mtime    ctime    atime uid gid 
data/ullyses.txt 1573151 FALSE 664 2015-06-01 15:25:55 2015-06-01 15:25:55 2015-06-01 15:25:55 1008 1008 

quindi estrarre la colonna chiamata size:

file.info("data/ullyses.txt")$size 
[1] 1573151 
+0

e se da "http:" esiste un modo per misurare le dimensioni prima di caricarle? – Rhodo

+1

Potrebbe essere necessario utilizzare 'download.file()' e quindi verificare localmente la dimensione del file. – Andrie

1

Se non si desidera scaricare il file prima di conoscere la sua dimensione, si può provare qualcosa di simile:

Nota: Funzionerà solo su Mac o Linux.

file_url = 'http://math.ucdenver.edu/RTutorial/titanic.txt' 
curl_cmd = paste('curl -X HEAD -i', file_url) 
system_cmd = paste(curl_cmd, '|grep Content-Length |cut -d : -f 2') 

Quanto sopra confezionare insieme una stringa da eseguire utilizzando system(). La stringa curl_cmd dice a curl di andare a ottenere solo l'intestazione del file.

I pacchetti di stringhe system_cmd su alcuni comandi aggiuntivi per analizzare l'intestazione ed estrarre solo il file.

Ora, chiamare system() e utilizzare l'argomento intern = TRUE per comunicare a R di trattenere l'output.

b <- system(system_cmd, intern = TRUE) 
## % Total % Received % Xferd Average Speed Time Time  Time Current 
##        Dload Upload Total Spent Left Speed 
## 0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:-- 0 
## curl: (18) transfer closed 

Scaricherà solo l'intestazione del file e lo analizzerà per ottenere il file. Ora b sarà il file in byte.


Poi si può decidere come aprire il file, o stampare qualcosa di amichevole come:?

print(paste("There are", as.numeric(b)/1e6, "mb in the file:", file_url)) 
## [1] "There are 0.055692 mb in the file: http://math.ucdenver.edu/RTutorial/titanic.txt" 
+0

Sarebbe bello se qualcuno potesse condividere una soluzione che funziona in tutti gli ambienti host. Ho provato a giocherellare con 'RCurl' per circa cinque minuti, ma non sono andato molto lontano. – neerajt

+1

https://stackoverflow.com/questions/20921593/how-to-determine-the-file-size-of-a-remote-download-without-reading-the-entire-f –

+0

Impressionante! Molto meglio. – neerajt