2017-06-06 7 views
0

Ich versuche eine HashMap zu lesen und in eine CSV-Datei zu schreiben. Ich verwende CSVPrinter, aber meine Methode gibt keine CSV-Datei zurück.Methode gibt keine CSV-Datei zurück - Java

Dies ist der Code, den ich verwenden: Edited-Code

import org.apache.commons.csv.CSVFormat; 
    import org.apache.commons.csv.CSVPrinter; 

public class SJV{ 
    public File writeCSV(Map featureSet) throws IOException{ 

     CSVFormat csvFileFormat = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR); 
     Map<String, Integer> map = featureSet; 
     File temp = File.createTempFile("tempfile", ".tmp"); 
     FileWriter fs = new FileWriter(temp); 

     CSVPrinter csvFilePrinter = new CSVPrinter(fs, csvFileFormat); 
     //csvFilePrinter.printRecord(FILE_HEADER); 

     csvFilePrinter.printRecord(map.keySet().toArray()); 
     csvFilePrinter.printRecord(map.values().toArray()); 



csvFilePrinter.close(); 
fs.close(); 


     return temp; 
    } 
} 

Dies ist der Test habe ich:

public void testWriteCSV() throws IOException { 
    SJV sj = new SJV(); 

    HashMap<String, Integer> hmap = new HashMap<String, Integer>(); 
    hmap.put("Feature1", 1); 
    hmap.put("Feature2", 2); 
    File fs = sj.writeCSV(hmap); 

    if (fs.exists()){ 
     Scanner input = new Scanner(fs); 

     while (input.hasNextLine()) 
     { 
      System.out.println(input.nextLine()); 
     } 
     input.close(); 
    } 

Ich verstehe wirklich nicht, warum das Verfahren nicht ein zurückkehr CSV-Datei.

+0

ist ein Stück Code fehlt. Was ist 'sj'? Wird etwas geschrieben? Irgendwelche Fehler? –

+0

Was liefert die Methode anstelle einer CSV-Datei? – CraigR8806

+0

Es wird eine leere Datei neu abgestimmt. – Kumaresp

Antwort

2

die Sie interessieren (in diesem Code habe ich das Format von TMP geändert .csv)

Ein Problem war, dass wir die csvFilePrinter nicht geschlossen wurden -> csvFilePrinter.close () und was ich von der Frage verstanden habe ist, dass der Benutzer eine CSV-Dateierweiterung erwartet, also habe ich die .csv-Erweiterung verwendet, während ich sie geschrieben habe. :

import java.io.File; 
    import java.io.FileWriter; 
    import java.io.IOException; 
    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.Scanner; 

    import org.apache.commons.csv.CSVFormat; 
    import org.apache.commons.csv.CSVPrinter; 

    public class TestMain { 

     public static void main(String args[]) { 

      HashMap<String, Integer> hmap = new HashMap<String, Integer>(); 
      hmap.put("Feature11", 1); 
      hmap.put("Feature22", 2); 
      CSVFormat csvFileFormat = CSVFormat.DEFAULT.withRecordSeparator(System.lineSeparator()); 
      Map<String, Integer> map = hmap; 
      File temp; 
      try { 
       temp = File.createTempFile("tempfile", ".csv"); 
       FileWriter fs = new FileWriter(temp); 

       CSVPrinter csvFilePrinter = new CSVPrinter(fs, csvFileFormat); 
       csvFilePrinter.printRecord(map.keySet().toArray()); 
       csvFilePrinter.printRecord(map.values().toArray()); 
       csvFilePrinter.close(); 

       System.out.println(" temp " + temp); 

       if (temp.exists()) { 
        Scanner input = new Scanner(temp); 

        while (input.hasNextLine()) { 
         System.out.println(input.nextLine()); 
        } 
        input.close(); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

    } 

Edited gemäß den Vorschlägen in Kommentar (Dieser Code funktioniert für mich, und hier ist die Ausgangsprobe):

temp C:\Users\<MY USERNAME>\AppData\Local\Temp\tempfile7124969351872886823.csv 
Feature11,Feature22 
1,2 
+0

Könnte eine gute Idee sein, nicht die IOException zu werfen und versuchen Sie es selbst zu fangen .. – JoeHz

0

Versuchen:

fs.flush(); 
fs.close(); 
csvFilePrinter.close(); 
+1

Es gibt keine Notwendigkeit, vor dem Schließen zu spülen.Es ist auch nicht notwendig, den' FileWriter' zu schließen, bevor der 'CSVPrinter' geschlossen wird (wenn' CSVPrinter' 'close()' hat) – RealSkeptic

+0

@ RealSkeptic Code aktualisiert – Kumaresp

+0

Die 'fs.close()' schließt fs bevor alle in den csvFilePrinter gepufferten Daten geleert werden Wenn Sie versuchen, 'csvFilePrinter' zu schließen, passiert nichts bevor fs bereits geschlossen ist –

Verwandte Themen