2015-04-07 14 views
5

Qual è il modo migliore in R per determinare se un file è o non è compresso? C'è qualche funzione particolare per controllarlo? Sto chiedendo qualcosa di diverso rispetto all'estensione del nome file ad es.Come verificare se un file è compresso in R

grepl("^.*(.gz|.bz2|.tar|.zip|.tgz|.gzip|.7z)[[:space:]]*$", filename) 
+2

In generale non è possibile stabilire se un file è compresso (o addirittura affatto quale formato è in). Tutto quello che puoi fare è testare i modelli di byte noti all'inizio del file, ma questo non è davvero più affidabile di controllare l'estensione del file. –

+0

Perché vuoi sapere questo in 'R'? Qual è il tuo obiettivo finale? –

+0

fread() dal pacchetto del bioconduttore data.table non accetta file compresso come argomento di input –

risposta

2

Se siete su Linux (o simili) è possibile utilizzare il comando file. Per esempio.

file filename 

Questo vi dirà informazioni utili su una vasta gamma di formati, tra cui, ad esempio, se il file è compresso con gzip (uno dei formati R in grado di leggere direttamente).

+3

In R, questo sarebbe 'system (" file filename ")' – Thomas

1

Se è stato installato java, è possibile utilizzare lo strumento gratuito Apache Tika per analizzare i metadati di un file.

installazione dopo il download:

alias tika='java -jar /opt/java_shared/tika/tika-app-1.7.jar' 

analizzare un file (lento, richiede ~ 5 secondi)

tika -m chroma-1.15.tar.bz2 

Content-Length: 2690725 
Content-Type: application/x-bzip2 
X-Parsed-By: org.apache.tika.parser.DefaultParser 
X-Parsed-By: org.apache.tika.parser.pkg.CompressorParser 
resourceName: chroma-1.15.tar.bz2 

Un altro esempio:

echo "hi there" > notazipfile.zip 

tika -m notazipfile.zip 

Content-Encoding: ISO-8859-1 
Content-Length: 9 
Content-Type: text/plain; charset=ISO-8859-1 
X-Parsed-By: org.apache.tika.parser.DefaultParser 
X-Parsed-By: org.apache.tika.parser.txt.TXTParser 
resourceName: notazipfile.zip 

C'è una pagina di aiuto:

tika --help 

lista lunga:

tika --list-supported-types | grep -C 3 bzip2 

application/x-bzip 
    supertype: application/octet-stream 
    parser: org.apache.tika.parser.pkg.CompressorParser 

Anche in questo caso: Probing file di grandi dimensioni può richiedere del tempo.

Nota esiste un sito web in cui qualcuno ha iniziato a creare un'interfaccia R, ma questa pagina web è a partire dal 2012, e sembra essere inattivo: https://r-forge.r-project.org/projects/r-tika/

2

In R, fare questo:

filetype = summary(file('yourfile.gz'))$class 

Se è gzip, filetype sarà gzfile


Nota: si potrebbe anche voler assegnare file di t o una variabile e chiudere la connessione dopo

filetype <- function(path){ 
    f = file(path) 
    ext = summary(f)$class 
    close.connection(f) 
    ext 
}