2016-06-21 15 views
-1

Ich habe eine CSV-Protokolldatei, und es enthält viele Zeilen wie folgt aus:Lesen und Schreiben Datei CSV mit Java

2016-06-21 12:00:00,000 : helloworld: header1=2;header2=6;header=0 

Ich möchte, dass sie auf eine neue CSV-Datei schreiben.

public void readLogFile() throws Exception 
{ 
    String currentLine = ""; 
    String nextLine = ""; 

    BufferedReader reader = new BufferedReader(new FileReader(file(false))); 
    while ((currentLine = reader.readLine()) != null) 
    { 
     if (currentLine.contains("2016") == true) 
     { 
      nextLine = reader.readLine(); 
      if (nextLine.contains("helloworld") == true) 
      {     
       currentLine = currentLine.substring(0, 23); 
       nextLine = nextLine.substring(22, nextLine.length()); 

       String nextBlock = replaceAll(nextLine); 
       System.out.println(currentLine + " : helloworld: " + nextBlock); 

       String[] data = nextBlock.split(";"); 
       for (int i = 0, max = data.length; i < max; i++) 
       { 
        String[] d = data[i].split("="); 
        map.put(d[0], d[1]); 
       } 
      } 
     } 
    } 
    reader.close(); 
} 

Dies ist meine Methode, um den Inhalt zu schreiben:

public void writeContentToCsv() throws Exception 
{ 
    FileWriter writer = new FileWriter(".../file_new.csv"); 
    for (Map.Entry<String, String> entry : map.entrySet()) 
    { 
     writer.append(entry.getKey()).append(";").append(entry.getValue()).append(System.getProperty("line.separator")); 
    } 
    writer.close(); 
} 

Dies ist die Ausgabe ich haben will:

header1; header2; header3 
2;6;0 
1;5;1 
5;8;8 
... 

Derzeit sieht die CSV-Datei wie folgt (nur zeigt, ein Datensatz):

header1;4 
header2;0 
header3;0 

Kann mir jemand helfen, den Code zu reparieren?

+1

Bitte verwenden Sie einen Debugger und sehen, wo ich t geht falsch – Sanjeev

Antwort

1

Erstellen Sie eine Klasse zum Speichern der Headerwerte und speichern Sie sie in der Liste. Iterieren Sie über die Liste, um die Ergebnisse zu speichern.

Die derzeit verwendeten Karte kann nur 2 Werte speichern (die den Header-Wert speichert (Name seinen entsprechenden Wert)

map.put (d [0], D [1]); hier d [ 0] wird header1 und d [1] wird 4 (aber wir wollen nur 4 von hier)

class Headervalues { 
    String[] header = new String[3]; 
} 

public void readLogFile() throws Exception 
{ 
    List<HeaderValues> list = new ArrayList<>(); 
    String currentLine = ""; 
    BufferedReader reader = new BufferedReader(new FileReader(file(false))); 
    while ((currentLine = reader.readLine()) != null) 
    { 
     if (currentLine.contains("2016") && currentLine.contains("helloworld")) 
     { 

       String nextBlock = replaceAll(currentLine.substring(22, currentLine.length()); 

       String[] data = nextBlock.split(";"); 
       HeaderValues headerValues = new HeaderValues(); 
       //Assuming data.length will always be 3. 
       for (int i = 0, max = data.length; i < max; i++) 
       { 
        String[] d = data[i].split("="); 
        //Assuming split will always have size 2 
        headerValues.header[i] = d[1]; 
       } 
       list.add(headerValues) 
      } 
     } 
    } 
    reader.close(); 
} 
public void writeContentToCsv() throws Exception 
{ 
    FileWriter writer = new FileWriter(".../file_new.csv"); 
    for (HeaderValues value : headerValues) 
    { 
     writer.append(value.header[0]).append(";").append(value.header[1]).append(";").append(value.header[2]); 
    } 
    writer.close(); 
} 
+0

Ich muss Ihren Vorschlag beheben, aber abgesehen davon, es hat funktioniert! Danke für Ihre Hilfe! – gpuk360

+0

Die Lösung sollte eine allgemeine Richtung geben, und sollte nicht als Beispiel dienen, da mir der gesamte Code nicht vollständig bekannt ist. Ich habe versucht, mich auf den bereitgestellten Code zu beschränken und minimale Änderungen vorzunehmen. Vielen Dank. – Jaiprakash

1

Für das CSV-Schreiben

public void writeCSV() { 

     // Delimiter used in CSV file 
     private static final String NEW_LINE_SEPARATOR = "\n"; 

     // CSV file header 
     private static final Object[] FILE_HEADER = { "Empoyee Name","Empoyee Code", "In Time", "Out Time", "Duration", "Is Working Day" }; 

     String fileName = "fileName.csv"); 
     List<Objects> objects = new ArrayList<Objects>(); 
     FileWriter fileWriter = null; 
     CSVPrinter csvFilePrinter = null; 

     // Create the CSVFormat object with "\n" as a record delimiter 
     CSVFormat csvFileFormat = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR); 

     try { 
      fileWriter = new FileWriter(fileName); 

      csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat); 

      csvFilePrinter.printRecord(FILE_HEADER); 

      // Write a new student object list to the CSV file 
      for (Object object : objects) { 
       List<String> record = new ArrayList<String>(); 

       record.add(object.getValue1().toString()); 
       record.add(object.getValue2().toString()); 
       record.add(object.getValue3().toString()); 

       csvFilePrinter.printRecord(record); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       fileWriter.flush(); 
       fileWriter.close(); 
       csvFilePrinter.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }