2016-03-22 4 views
2

Ich wollte ein Programm schreiben, das die unregelmäßigen CSV-Dateien drucken und ändern kann. Das Format ist wie folgt:Ändern komplexer csv-Dateien in Java

1.date 
    2.organization name 
    3. student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
    1.another date 
    2.another organization name 
    3. student name, id number, residence 
     student name, id number, residence 
     student name, id number, residence 
     .......... 

Zum Beispiel können die Daten wie folgt angegeben werden:

1. 10/09/2016 
2. cycling club 
3. sam, 1000, oklahoma 
    henry, 1001, california 
    bill, 1002, NY 
1. 11/15/2016 
2. swimming club 
3. jane, 9001, georgia 
    elizabeth, 9002, lousiana 

Ich bin ein Anfänger und ich habe keine tragfähige Ressource online, die mit dieser Art befasst gefunden von Problem. Mein Hauptanliegen ist, wie durchlaufen wir die Schleife und identifizieren das Datum und den Namen des Clubs und füttern sie in ein Array? Bitte beraten.

+0

Ist dieser zweite Codebereich ein Beispielschema oder eine Beispieldatei? Es sieht nicht wie eine CSV-Datei aus. –

+1

Eigentlich ist das gar nicht so schwer: Mit einem Scanner lesen Sie zeilenweise; Diejenigen, die Daten enthalten sollten, können mit SimpleDateFormatter analysiert werden; nächste Zeile ... Sie speichern nur die Zeichenfolge, und die nächste Zeile, die Sie in einen CSV-Parser eingeben (googeln Sie einfach für diesen Begriff; Sie ergeben viele Bibliotheken, die dabei helfen). – GhostCat

Antwort

1

Ich denke, das sollte für Sie hilfreich sein. Grundsätzlich sollte es ein Muster in Ihrem versauten csv geben. Unten ist mein Code Ihre csv

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { 

     PrintWriter writer = new PrintWriter("file.txt", "UTF-8"); 
      try{ 

       //Create object of FileReader 
       FileReader inputFile = new FileReader("csv.txt"); 

       //Instantiate the BufferedReader Class 
       BufferedReader bufferReader = new BufferedReader(inputFile); 

       //Variable to hold the one line data 
       String line; 
       String date="";String org ="";String student =""; 
       // Read file line by line and print on the console 
       while ((line = bufferReader.readLine()) != null) { 
        if(line.contains("1.")){ 
         if(date!="" || org!=""){ 
          writer.println(date+","+org+","+student); 
          student =""; 
         } 
         date = line.substring(2); 
         }else if(line.contains("2.")){ 
          org = line.substring(2); 

         }else{ 
          line = "("+line+")"; 
          student += line+","; 
        } 

        System.out.println(line); 
       } 
       writer.println(date+","+org+","+student); 
       //Close the buffer reader 
       bufferReader.close(); 
     }catch(Exception e){ 
     System.out.println("Error while reading file line by line:" + e.getMessage());      
    } 
     writer.close(); 
    } 

Dies ist die Ausgabe vereinbaren Sie für diese

10/09/2016, cycling club,(3. sam, 1000, oklahoma),( henry, 1001, california),( bill, 1002, NY), 
    11/15/2016, swimming club,(3. jane, 9001, georgia),( elizabeth, 9002, lousiana), 

erhalten werde ich die Datei von csv.txt lese. while-Schleife durchläuft jede Zeile der Textdatei. Alle Felder werden in einer Variablen gespeichert. Wenn das nächste Datum kommt, schreibe ich alle in die Ausgabedatei. Die letzte Zeile des CSV wird in die Datei geschrieben, nachdem die while-Schleife beendet wurde.

+1

Vielen Dank für Ihre Eingabe. Ihr Code ist sehr klar und leicht zu verstehen. Das hat mir sehr geholfen. –

+0

Gern geschehen. – denis

1

Versuchen Sie uniVocity-parsers, damit umzugehen. Um diese Art von Format zu analysieren, finden Sie einige Beispiele here. Zum Schreiben, siehe here und .

Anpassung der Beispiele, die ich gegeben habe, könnten Sie schreiben:

final ObjectRowListProcessor dateProcessor = new ObjectRowListProcessor(); 
final ObjectRowListProcessor clubProcessor = new ObjectRowListProcessor(); 
final ObjectRowListProcessor memberProcessor = new ObjectRowListProcessor(); 

InputValueSwitch switch = new InputValueSwitch(0){ 
    public void rowProcessorSwitched(RowProcessor from, RowProcessor to) { 
    //your custom logic here 
    if (to == dateProcessor) { 
     //processing dates. 
    } 
    if (to == clubProcessor) { 
     //processing clubs. 
    } 
    if (to == memberProcessor){ 
     //processing members 
    } 
}; 

switch.addSwitchForValue("1.", dateProcessor, 1); //getting values of column 1 and sending them to `dateProcessor` 
switch.addSwitchForValue("2.", clubProcessor, 1); //getting values of column 1 and sending them to `clubProcessor` 
switch.addSwitchForValue("3.", memberProcessor, 1, 2, 3); //getting values of columns 1, 2, and 3 and sending them to `memberProcessor` 
setDefaultSwitch(memberProcessor, 1, 2, 3); //Rows with blank value at column 0 are members. Also get columns 1, 2, and 3 and send them to `memberProcessor` 

CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial and examples 

// configure the parser to use the switch 
settings.setRowProcessor(switch); 

//creates a parser 
CsvParser parser = new CsvParser(settings); 

//parse everying. Rows will be sent to the RowProcessor of each switch, depending on the value at column 0. 
parser.parse(new File("/path/to/file.csv")); 

Haftungsausschluss: Ich bin der Autor dieser Bibliothek ist es Open-Source und kostenlos (Apache 2.0 Lizenz)