2017-09-12 1 views
0

J'ai une URL avec un fichier .zip qui contient des fichiers .CSV.Télécharger un fichier zip, extraire le fichier CSV et l'analyser - Tout en mémoire - Java

J'écris une application en Java qui doit télécharger ce fichier .zip et accéder aux fichiers CSV dans le fichier .zip et les analyser dans une liste de CSVRecords en utilisant Apache Commons CSV. Je ne veux pas avoir à écrire un fichier sur le disque, car c'est une perte de performance.

C'est ce que j'ai jusqu'à présent (j'omis toute erreur de manipulation pour l'instant, il est juste un POC):

URL url = new URL(myURLString); 
InputStream input = url.openStream(); 
ZipInputStream zipIn = new ZipInputStream(input); 
ZipEntry entry; 
while((entry = zipIn.getNextEntry()) != null) { 
    InputStreamReader isr = new InputStreamReader(zipIn); 
    CSVParser csv = new CSVParser(isr, CSVFormat.DEFAULT); 
    List<CSVRecord> records = csv.getRecords(); <----- THIS IS WHERE IT HANGS! 
} 

Pour une raison quelconque, je ne peux pas comprendre pourquoi il se bloque lorsque les essais de CSVParser lire les fichiers. Toute aide est grandement appréciée!

P.S .: Je peux lire un fichier CSV très bien quand il est pas dans un zip, comme tel:

URL url = new URL(myURLString); 
InputStream input = url.openStream(); 
InputStreamReader reader= new InputStreamReader(input); 
CSVParser csv = new CSVParser(reader, CSVFormat.DEFAULT); 
List<CSVRecord> records = csv.getRecords(); 
+0

pouvez-vous essayer CSVFormat.Excel et laissez-moi savoir ce qui se passe? – user641887

+0

Il se bloque juste là, ne retourne rien –

+0

Pouvez-vous vous assurer que le contenu du fichier zip est correct et il a tous les fichiers avec des extensions .csv seulement – user641887

Répondre

0

Peut-être essayer l'aide d'un analyseur différent. L'utilisation de univocity-parsers signalera probablement toute erreur de traitement de vos fichiers.

il suffit de changer pour:

URL url = new URL(myURLString); 
InputStream input = url.openStream(); 
ZipInputStream zipIn = new ZipInputStream(input); 
ZipEntry entry; 
//configure the parser to detect the CSV format automatically 
CsvParserSettings parserSettings = new CsvParserSettings(); 
parserSettings.detectFormatAutomatically(); 
//use this if the files are small (less than 50mb each) 
//parserSettings.setReadInputOnSeparateThread(false); 

CsvParser csv = new CsvParser(parserSettings); 

while((entry = zipIn.getNextEntry()) != null) { 
    InputStreamReader isr = new InputStreamReader(zipIn); 
    List<Record> records = csv.parseAllRecords(isr); 
} 

Hope it helps.

Avertissement: Je suis l'auteur de cette librairie. C'est open-source et gratuit (licence Apache 2.0)