2014-05-21 5 views
1

J'ai un fichier TSV très simple, avec des entrées comme si:CsvMapReader ne semble pas analyser mon fichier

614 2006-07-13 15:30:05 2009-11-20 23:56:21 510 350 3265 10 34 
1038 2006-07-15 16:12:15 2009-11-16 05:12:11 304 443 4405 7 156 
1437 2006-07-16 12:29:24 2009-11-16 16:25:12 45 73 725 6 37 
2615 2006-07-19 23:23:55 2009-11-27 18:34:36 211 230 211 7 0 
3148 2006-07-26 14:17:22 2009-11-20 17:35:18 7346 7244 11438 8 97 
5593 2006-09-08 10:58:49 2009-11-24 06:08:27 898 1024 2897 8 56 

Il n'a pas les en-têtes, et je l'obtenir d'une autre source, donc je n'a aucun contrôle sur la façon dont il est écrit. Je veux lire dans la première colonne, faire quelque chose avec, et ignorer le reste.

Mon code est:

List<Long> userIds = new ArrayList<Long>(); 

    ICsvMapReader mapReader = null; 
    try { 
     mapReader = new CsvMapReader(new FileReader(inFile), CsvPreference.TAB_PREFERENCE); 

     // only map the first column - setting header elements to null means those columns are ignored 
     final String[] header = new String[] { "userid", null, null, null, null, null, null }; 

     final CellProcessor[] processors = new CellProcessor[] {null, 
       null, 
       null, 
       null, 
       null, 
       null, 
       null }; 

     Map<String, Object> userMap; 
     while((userMap = mapReader.read(header, processors)) != null) { 
      Long userId = Long.parseLong(userMap.get("userid").toString()); 
      userIds.add(userId); 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finally { 
     IOUtils.closeQuietly(mapReader); 
    } 

Je reçois aucune exception, mais la ligne mapReader.read() retourne toujours null. J'ai essayé d'utiliser new ParseLong() à la place de null dans la première position du processeur, et cela n'a eu aucun effet. J'ai l'impression qu'il me manque quelque chose de vraiment basique.

Répondre

0

Votre code fonctionne bien pour moi, bien que je devais ajouter un élément supplémentaire null à l'en-tête et aux processeurs car il y a en réalité 8 colonnes dans vos données. Sinon, super CSV jette une exception:

org.supercsv.exception.SuperCsvException: The number of columns 
to be processed (8) must match the number of CellProcessors (7): 
check that the number of CellProcessors you have defined matches 
the expected number of columns being read/written 
context={lineNo=1, rowNo=1, columnNo=1, rowSource= 
[614, 2006-07-13 15:30:05, 2009-11-20 23:56:21, 510, 350, 3265, 10, 34]} 

Je vérifie que vous lisez dans le fichier correct - il semble que vous lisez dans un fichier vide ...

+0

Lorsque j'ai ajouté les valeurs nulles supplémentaires, cela a fonctionné. Je jure que j'ai compté deux fois et obtenu sept colonnes. Je n'ai jamais eu d'exception, cependant, que je trouve étrange. Je vous remercie! – betseyb

+0

Hmmm doit être le code qui l'appelle - je suppose qu'il avale SuperCsvException –

0

Utilisez uniVocity-parsers pour analyser votre fichier TSV:

TsvParserSettings parserSettings = new TsvParserSettings(); 
parserSettings.selectIndexes(0); //selects the first column only 
TsvParser parser = new TsvParser(parserSettings); 

//the rows will contain a String array of length 1, with the values of the first column only. 
List<String[]> parsedRows = parser.readAll(new FileReader(yourFile)); 

De même, n'utilisez pas d'analyseur CSV pour analyser un fichier TSV. L'algorithme d'analyse syntaxique n'est pas équivalent (même si cela semble initialement).

Divulgation: Je suis l'auteur de cette bibliothèque. C'est open-source et gratuit (licence Apache V2.0).

+0

SuperCSVParser est configuré pour gérer également les fichiers TSV. Cela a fonctionné parfaitement une fois que j'avais le nombre de colonnes correctes. – betseyb

+0

Soyez prudent. Avez-vous vérifié s'il analysait correctement les séquences d'échappement? Par exemple, dans les entrées TSV, '\' suivi de '\ t' représente un caractère de tabulation dans une valeur. Si vous utilisez un analyseur CSV pour analyser cela, vous obtiendrez la séquence d'échappement au lieu du caractère de tabulation. Il existe également d'autres séquences d'échappement dans TSV. Autre chose à considérer: si la valeur dans votre champ TSV contient ", ou pire, si elle commence par", votre analyseur CSV peut interpréter cela comme une valeur entre guillemets et n'arrêtera pas de lire jusqu'à ce qu'il en trouve un autre ", peut-être quelques centaines enregistrements plus tard. –

Questions connexes