2012-06-04 3 views
0

Je souhaite lire un fichier PSV en utilisant java. Les enregistrements dans mon fichier PSV ont 4 colonnes. Je veux lire et sortir seulement les 3 et 4ème colonnes. Quelle est la meilleure façon de procéder. Voici ce que j'ai:Lecture d'un fichier PSV Java

BufferedReader PSVFile = new BufferedReader(new FileReader(fileName)); 
String dataRow = PSVFile.readLine(); 
while (dataRow != null) 
{ 
    String[] dataArray = dataRow.split("\n"); 
    for (String item:dataArray) 
    { 
     String[] elements = item.split("|"); 
     System.out.println(item); 
    } 
    System.out.println(); 
    dataRow = PSVFile.readLine(); 
} 
PSVFile.close(); 
System.out.println(); 

Basé sur la suggestion @AljoshaBre Iam utilisant CSVReader, en faisant ceci:

reader = new CSVReader(new FileReader(fileName),'|'); 
String [] nextLine; 
while ((nextLine = reader.readNext()) != null) 
{ 
System.out.println(nextLine[3] + nextLine[4]); 
} 

Je reçois la sortie désirée mais obtiens une erreur: Exception dans le thread " main "java.lang.ArrayIndexOutOfBoundsException: 2 à Read_PSV.main (Read_PSV.java:20) La ligne 20 est System.out.println (nextLine [3] + nextLine [4]);

+0

Tuyau séparé ou séparé en période? – Brendan

+0

Tuyau séparé. – Ram

+0

Si vous obtenez cette exception, cela signifie probablement que votre tableau de jetons n'est pas aussi gros que vous le pensez. Peut-être que vous ne traitez pas correctement les lignes vierges (c'est-à-dire 0 ou 1 tableaux de jetons de longueur (en fonction de ce que l'opencsv veut vous redonner dans ce cas) – Matt

Répondre

0

OpenCSV est mon arme de choix.

Cet extrait vous obtiendrez troisième et quatrième colonnes:

try { 
    //last parameter tells it which line (row) to consider as the first one 
    CSVReader reader = new CSVReader(new FileReader("res/test.csv"), '|', '\0', 1); 
    String[] row; 

    List<String> columnThree = new ArrayList<String>(); 
    List<String> columnFour  = new ArrayList<String>(); 

    while((row = reader.readNext()) != null) { 
     columnThree.add(row[2]); 
     columnFour.add(row[3]); 
    } 
    reader.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Il imprimeront

Nikola 
Nenad 
Ljubinka 
Gordana 

pour cette entrée:

test.psv

Name|Surname|Father|Mother 
Aleksandar|Milic|Nikola|Ljubinka 
Nebojsa|Jakovljevic|Nenad|Gordana 
+0

J'utilise CSVReader maintenant mais je reçois une erreur. – Ram

+0

Votre boucle n'est pas bonne Essayez d'obtenir les colonnes en utilisant la méthode get() de CSVReader, comme je l'ai fait – nullpotent

+0

@ AljoshaBre- Il ne semble pas y avoir de méthode get(). J'obtiens l'erreur suivante: "La méthode get (int) n'est pas défini pour le type CSVReader " – Ram

0

Commons-Lang a une classe agréable pour cela aussi:

// get a csv instance (which is cloned, so we can customize it) 
StrTokenizer tokenizer = StrTokenizer.getCSVInstance(); 

// Set delimiter char 
tokenizer.setDelimiterChar('|'); 

Scanner scanner = new Scanner(new File("file.psv")); 
while (scanner.hasNextLine()) { 
    // set the input on the tokenizer 
    tokenizer.reset(scanner.nextLine()); 
    // get the tokens 
    String toks[] = tokenizer.getTokenArray(); 
} 

REMARQUE: StrTokenizer lui-même est conçu pour fonctionner sur un seul enregistrement à la fois, vous devez donc utiliser quelque chose comme le scanner de java pour tirer dans une ligne à la fois. Le StrTokenizer est lui-même réutilisable (mais pas threadsafe) via la méthode "reset".

Il dispose d'une foule d'options telles que les guillemets, la gestion des espaces, la gestion des jetons vides, etc ... Vous ne savez pas exactement quelles options opencsv aurait.