2009-12-10 9 views
2

Comment puis-je analyser mon fichier CSV sans analyser la première ligne?Parser groovy csv et l'exportation vers la base de données

Ce cours fonctionne mais je ne veux pas analyser l'en-tête de mon fichier CSV.

import groovy.sql.Sql 

class CSVParserService { 

    boolean transactional = false 

    def sql = Sql.newInstance("jdbc:mysql://localhost/RProject", "xxx", "xxx", "com.mysql.jdbc.Driver") 

    def CSVList = sql.dataSet("ModuleSet") 

    def CSVParser(String filepath, boolean header) { 

     def parse = new File(filepath) 

     // split and populate GeneInfo 
     parse.splitEachLine(',') {fields -> 

     CSVList.add(
       Module : fields[0], 
       Function : fields[1], 
       Systematic_Name : fields[2], 
       Common_Name : fields[3], 
      ) 

     return CSVList 
     } 

    } 
} 

-je changer ma classe, alors maintenant je:

import groovy.sql.Sql 

class CSVParserService { 

    boolean transactional = false 

    def sql = Sql.newInstance("jdbc:mysql://localhost/RProject", "xxx", "xxx", "com.mysql.jdbc.Driver") 

    def CSVList = sql.dataSet("ModuleSet") 

    def CSVParser(String filepath, boolean header) { 

    def parse = new File(filepath).readLines()[1..-1] 

    parse.each {line -> 

     // split and populate GeneInfo 
     line.splitEachLine(',') {fields -> 

     CSVList.add(
       Module : fields[0], 
       Function : fields[1], 
       Systematic_Name : fields[2], 
       Common_Name : fields[3], 
      ) 

     return CSVList 
     } 
    } 
    } 
} 

fonctionne très bien, jusqu'à ce que cette partie dans mon CSV:
« Homo sapiens récepteur de l'interleukine 4 (IL4R), transcription variante 1, ARNm. "

Quand mon analyseur obtenir cette partie, il passe en 3 (qui devrait être en 1):
- Homo sapiens interleukine 4 récepteurs (IL4R)
- variante de transcription 1
- ARNm.

Comment puis-je résoudre ce problème? Nous vous remercions de votre aide.

- Nouveau commentaire - Voici une copie (2ème ligne) de ma ligne CSV:
"M6.6", NA, "ILMN_1652185", NA, NA, "IL4RA, CD124", NA, "NM_000418.2", "16", "16p12.1a", "Homo sapiens récepteur interleukine 4 (IL4R), variante de transcription 1, l'ARNm.", 3566, ...

Comme vous pouvez voir mon problème est en ligne "Homo sapiens interleukin 4 récepteur (IL4R), transcript variante 1, ARNm." ; Je ne veux pas couper le texte entre "et". Mon analyseur ne devrait séparer que des guillemets (mais pas des virgules entre guillemets). Par exemple j'ai "part1", "part2", "part3", je veux juste couper partie1, partie2, partie3, et s'il y a des virgules dans ma partie2, je ne veux pas couper ces virgules. En résumé, je veux juste ignorer les virgules dans les éléments entre guillemets.

Répondre

1

Ok, j'ai ma solution!

Voici le code:

import groovy.sql.Sql 

class CSVParserService { 

    boolean transactional = false 

    def sql = Sql.newInstance("jdbc:mysql://localhost/RProject", "xxx", "xxx", "com.mysql.jdbc.Driver") 

    def CSVList = sql.dataSet("ModuleSet") 

    def CSVParser(String filepath, boolean header) { 

    def parse = new File(filepath).readLines()[1..-1] 

    def token = ',(?=([^\"]*\"[^\"]*\")*[^\"]*$)' 

    parse.each {line -> 

     // split and populate GeneInfo 
     line.splitEachLine(token) {fields -> 

     CSVList.add(
       Module : fields[0], 
       Function : fields[1], 
       Systematic_Name : fields[2], 
       Common_Name : fields[3], 
      ) 

     return CSVList 
     } 
    } 
    } 
} 

Voir cet article pour plus de détails: Java: splitting a comma-separated string but ignoring commas in quotes

+0

Avez-vous envisagé d'utiliser un analyseur CSV qui fait tout cela pour vous? Comme Ostermiller? [http://ostermiller.org/utils/CSV.html][1] [1]: http://ostermiller.org/utils/CSV.html – Philippe

+0

Enfin, je choisis cet analyseur CSV: http://opencsv.sourceforge.net/. Merci. –

+1

Voici une autre librairie d'analyse csv pour Groovy que j'ai créée il y a longtemps: [GroovyCSV] (http://xlson.com/groovycsv/). C'est basé sur opencsv. – xlson

1

Vous pouvez lire chaque ligne du fichier, sauf le premier dans un List en utilisant:

List<String> allLinesExceptHeader = new File(filepath).readLines()[1..-1] 

Chaque ligne du fichier (un élément de allLinesExceptHeader) peut alors être analysé en utilisant un code similaire à celui indiqué ci-dessus

allLinesExceptHeader.each {line ->  
    // Code to parse each line goes here 
} 
+0

utilisant remove (0) sur la liste des lignes pourrait être plus efficace qu'une gamme sur un grand fichier? – leebutts

Questions connexes