# In CSV-Datei schreiben



## Unregistriert (2. Nov 2009)

Hi Leute,

Also mein Problem ist das ich zwar aus einer CSV-Datei lesen kann aber jedoch nicht in eine schreiben.
Es steht dabei keine Fehlermeldung das die Datei nicht gefunden wurde, jedoch wenn ich nach dem Ausführen des programms in die CSV datei schau ist die leer.
Ich weiß nicht was ich dabei falsch mache.
Das wäre mein Quelltext: 


```
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            BufferedReader f;
            String line;
            int i = 1;
            FileWriter f1;           
            f1 = new FileWriter("ausgabedatei.csv");
            try {
                f = new BufferedReader(new FileReader("Dateipfad"));
                while ((line = f.readLine()) != null) {
                    System.out.println(i + "  " + line);
                    String s1 = i + line;
                    BufferedWriter bw = new BufferedWriter(new FileWriter("ausgabedatei.csv"));
                    bw.write(s1);
                    i++;
                }
                f.close();
                f1.close();
            } catch (IOException e) {
                System.out.println("Fehler beim Lesen der Datei");
            }
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
```

Ich arbeite mit Netbeans und die CSV-Dateien habe ich direkt im Projekt angelegt.


Danke im Vorraus.

mfg


P.S. Weiß das ein paar Zeilen Code umsonst sind


----------



## HoaX (2. Nov 2009)

2 Fehler:
a) Du überschreibst deine Ausgabedatei bei jedem Durchlauf
b) Du schließt nirgendwo die Ausgabe ab, d.h. der BufferedWriter schreibt nie in die Datei -> leer

PS: Wenn du weist dass manche unnötig sind, wieso lässt du diese dann nicht weg?!


----------



## Unregistriert (2. Nov 2009)

HoaX hat gesagt.:


> 2 Fehler:
> a) Du überschreibst deine Ausgabedatei bei jedem Durchlauf



wie könnte man das denn vermeiden?

p.s.: sorry wenn das ne blöde frage ist aber mir will es einfach nicht einfallen.


----------



## AndyHa (2. Nov 2009)

Hallo,
das Überschreiben vermeidest du, indem du den BufferedWriter außerhalb der Schleife initialisierst und nur das eigentliche Lesen und Schreiben innerhalb der Schleife behandelst.

Die Zeile

```
BufferedWriter bw = new BufferedWriter(new FileWriter("ausgabedatei.csv"));
```
also vor die while-Schleife setzen.

Ich hoffe, dann funktioniert es.

Grüße
Andy


----------



## Mcburn (12. Nov 2009)

Ich hätte dazu noch ne Frage.

Bei mir bringt er immer eine NullPointerException beim speichern.


```
public void actionPerformed(ActionEvent e)
  {

   try{
  


  
     Object obj = e.getSource();
     if(obj == befehl.btnBeenden) System.exit(0);
  
     DecimalFormat df= new DecimalFormat("#,##0.00");
  
     String menuText;

     //chooser.addChoosableFileFilter(csvFilter);

     chooser.setDialogTitle("CSV Datei Oeffnen");



  
    menuText = e.getActionCommand();
    
    if (obj == befehl.btnBeenden || obj instanceof MenuItem && menuText == "Beenden")
            { 
            System.exit(0);
          }//if (obj == fenster.btnBeenden)
    


    if(obj == befehl.btnEinlesen || obj instanceof MenuItem && menuText == "Einlesen" )
      {

        chooser.setMultiSelectionEnabled(true);
        int option = chooser.showOpenDialog(null);
        
        
        FileInputStream fis = new FileInputStream(chooser.getSelectedFile().getPath());
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader reader = new BufferedReader(isr);




        FileOutputStream fes = new FileOutputStream("VergleichSpeicher.csv");
        OutputStreamWriter res = new OutputStreamWriter(fes);
        BufferedWriter speicher = new BufferedWriter(res);
        if(option == JFileChooser.APPROVE_OPTION)
          {

          while( i < 5000){
          
                                               csvdaten[i] = reader.readLine();
                                               System.out.println(csvdaten[i]);
                                               
                                               speicher.write(csvdaten[i]);
                                               i++;
                                               }

          System.out.println(reader.readLine());





          //buff = new BufferedReader();
          }

      }
     if(obj == befehl.btnTest )
      {
      }



   } //try block
  catch(FileNotFoundException error)
    {
    befehl.lblLeer.setText("Fehler bei Eingabefeld..");
    }
  catch(IOException error){
    befehl.lblLeer.setText("Fehler bei Eingabefeld..");
  }
  catch(NullPointerException error){
    befehl.lblLeer.setText("Fehler beim Speichern");
  }
    
  }//public void actionPerformed(ActionEvent e)
```


----------



## SlaterB (12. Nov 2009)

bitte für die Zukunft bedenken:
- muss ich mein Programm gleich mit einer 5000-Zeilen-Datei testen? reichen nicht 50 oder gar erstmal nur 3?

- poste ich einen Teil meines Programms mit unbekannten Variablen, mit unnötigen Blahblah wie 30 Zeilen zum Thema Programm-beenden, ein nicht verwendetes new DecimalFormat("#,##0.00") oder unnötiger Exception-Behandlung,
oder versuche ich ein kurzes für jeden verständliches Testprogramm zu erstellen

- formatierten Code usw.

```
public class Test {
    public static void main(String[] args) throws Exception {
        String file = "test.csv";
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader reader = new BufferedReader(isr);

        FileOutputStream fes = new FileOutputStream("VergleichSpeicher.csv");
        OutputStreamWriter res = new OutputStreamWriter(fes);
        BufferedWriter speicher = new BufferedWriter(res);

        String[] csvdaten = new String[5000];
        int i = 0;
        while (i < 5000)         {
            csvdaten[i] = reader.readLine();
            System.out.println(csvdaten[i]);

            speicher.write(csvdaten[i]);
            i++;
        }
    }
}
```

---------

die Exception trat bei mir auf, wenn zu wenig Zeilen vorhanden sind, dann liefert reader.readLine() null, was der Writer gar nicht gut findet


----------



## Mcburn (12. Nov 2009)

Okay danke schön . Tut mir leid ich wollte Anfangs nur den Fehler verursachenden Code hinschreiben war aber unsicher und hab deswegen alles reingeschrieben.

Ich gelobe besserung.


----------



## vsk (24. Nov 2009)

Ich komme mit diesen ganzen Möglichkeiten nicht zurecht
RandomAccessFile
FileWriter
Buffered
;(

Ich möchte doch eigentlich nur immer mal wieder Daten in eine CSV Datei schreiben, im Stil
babla;blabla;blabla;

Dafür baue ich mit mittels der getMethoden eines Objectes einene String mit Trennzeichen ";" aber ich habe keinen Plan wie ich denn in eine Datei schreiben kann.

Wenn ich das mit in meine While Schleife packe, dann erzeugt er ja immer einen neuen BufferedReader oder?


```
private boolean schreibeDaten(Vector PersonenVector){
        boolean status = false; //Rückgabewert wird true falls geschrieben werden konnte
        String SpeicherString ="wenn Sie dies in der Datei lesen ist ein Fehler passiert";
        Iterator iti = PersonenVector.iterator(); //Zeiger zum "Durchwandern" des Vectors "alternativ" zur for-Schleife
        BufferedWriter bw;
        try{
            bw = new BufferedWriter(new FileWriter("ausgabedatei.csv"));
        }catch (Exception e){}
        while(iti.hasNext()){
            Person einePerson=(Person)iti.next();
            SpeicherString=einePerson.getAnrede()+";"+einePerson.getName()+";"+einePerson.getVorname()+";"
                    +einePerson.getStrasse()+";"+einePerson.getPLZ()+";"+einePerson.getOrt()+";"
                    +einePerson.getTelefon()+";"+einePerson.getFax()+";"+einePerson.getBemerkung()+"\n"; 
// ; ist Trennzeichen, evtl durch globale Variable ersetzen
            try{
                bw = new BufferedWriter(new FileWriter("ausgabedatei.csv"));
                bw.write(SpeicherString);
            }catch (IOException e){}
            
        }
        return status;
    }
```


----------



## SlaterB (24. Nov 2009)

Zeile 16 weg, am Ende noch 
bw.flush();
bw.close();


----------



## vsk (24. Nov 2009)

Danke fuer die schnelle Antwort.

Problem, wenn ich 

```
bw = new BufferedWriter(new FileWriter("ausgabedatei.csv"));
```

ausserhalb der while Schleife anbringe, erhalte ich den Fehler das "bw" möglicherweise nicht initialisiert wurde

und muss ich nicht ein RandomAccessFile machen damit er mir die Datei anlegt?


----------



## SlaterB (24. Nov 2009)

stimmt, das erste try/catch könnte zu einem nicht-initialsierten bw führen,
schreibe in Zeile 5
BufferedWriter bw = null;
dann bekommst du im Fehlerfall schlimmstenfalls eine NullPointerException,

oder verwende nur ein try/ catch um den gesamten Code


FileWriter legt eine Datei an wie RandomAccessFile auch


----------



## vsk (24. Nov 2009)

Danke! funktioniert alles !

und hier fuer nachfolgende Generationen 
PersonenVector enthält Objecte vom Typ Person (Eigenbau)

```
private boolean schreibeDaten(Vector PersonenVector){
        boolean status = false; //Rückgabewert wird true falls geschrieben werden konnte
        String SpeicherString ="wenn Sie dies in der Datei lesen ist ein Fehler passiert";
        Iterator iti = PersonenVector.iterator(); //Zeiger zum "Durchwandern" des Vectors "alternativ" zur for-Schleife
        BufferedWriter bw = null;
        try{
            bw = new BufferedWriter(new FileWriter(DateiName)); //Dateiname ist ein String "meineDatei.csv"
        
            while(iti.hasNext()){
                Person einePerson=(Person)iti.next();
                SpeicherString=einePerson.getAnrede()+";"+einePerson.getName()+";"+einePerson.getVorname()+";"
                    +einePerson.getStrasse()+";"+einePerson.getPLZ()+";"+einePerson.getOrt()+";"
                    +einePerson.getTelefon()+";"+einePerson.getFax()+";"+einePerson.getBemerkung()+"\n"; // ; ist Trennzeichen, evtl durch globale Variable ersetzen
            
                bw.write(SpeicherString); //String schreiben
                bw.flush();//Puffer leeren
            }
            bw.close();//BufferWriter schliessen
            status=true;
        }catch (Exception e){}
        return status;
    }
```


----------

