# CSV Parser



## Deepdish (20. Apr 2009)

Hy Leute, 
ich hab ein kleines Problem mit meinem Java Code. 
Mein Java code soll eine .txt Datei einlesen, dass sind diese drei zeilen: 

1.5,10,100,3.14
"Text",123.46,"zweiundvierzig",12/31/79
1,1.1,1.2,1.3

Und In Deutschland soll sie so aussehen:

"1,5",10,100,"3,14"
"Text","123,46","zweiundvierzig",31.12.79
1,"1,1","1,2","1,3"

Die .txt Datei sollen wir in unserem workspace reinlegen damit der Algorithmus, den ich gleich vorstellen werde einlesen soll und dann als neue Datei auslesen soll.

Für genauere Information pflege ich die Fragstellung nochmals ein {

CSV-Dateien umwandeln Englisch → Deutsch
In Ihrer Firma werden Daten aus Tabellenkalkulationsprogrammen und Datenbanken
häufig als CSV („comma separated values“) ausgetauscht. Solche Dateien bestehen für
jede Tabellenzeile aus einer Textzeile, darin für jede Tabellenspalte ein Eintrag. Die
Einträge sind durch Komma („.“) getrennt und können Zahlen, Datumsangaben, oder in
doppelte Anführungszeichen eingeschlossene Texte sein. Eine Zahl besteht aus Ziffern,
eventuell einem Dezimalpunkt, und weiteren Ziffern als Nachkommastellen. Weiterhin
können auch Datumsangaben in der Form Monat/Tag/Jahr vorhanden sein. Die Aufgabe
ist nun folgende:
Für die deutsche Niederlassung dieser internationalen Firma sollen diese Dateien an die
deutschen Konventionen angepasst werden, so dass Zahlen mit Dezimalkomma (statt
Dezimalpunkt) dargestellt werden und Datumsangaben mit Punkten in der Form
Tag.Monat.Jahr. Dann kann das Komma allerdings nicht mehr so ohne weiteres als
Trennzeichen verwendet werden, oder alle Zahlen mit Dezimalkomma müssen durch
Anführungszeichen „geschützt“ werden. Eine Beispieldatei aus den USA sähe
folgendermaßen aus: }

Hier der Code den ich soweit programmiert habe. Es handelt sich um ein MINIMALEN FEHLER.. Leider fehlt mir das WISSEN dazu ich hoffe ihr könnt mir helfen!!!
Hier nun der Code:


```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.StringTokenizer;

public class Parser  {

    
    int time;//Laufzeitparameter
    String oldformat;//Altes Format
    String dummy;//Hilfsstring 
    String newformat;//Neues Format 
    String ausgabe;
    String dategerman;
    
    
    char comma = '\u002C';// Unicode fuer ,
    char point = '\u002E';// Unicode fuer .
    char solidus = '\u002F';//Unicode fuer 
    

    public void read() {
            
        try {

            File datei = new File("test1.txt");//Einlesen der Textdatei (korrekter Name benoetigt)
            FileReader reader = new FileReader(datei);
            BufferedReader buffer = new BufferedReader(reader);
        
            
            while (buffer.ready()==true){
            
            oldformat = buffer.readLine();
                
                StringTokenizer str = new StringTokenizer(oldformat);
                
                while (str.hasMoreTokens())
                    
                dummy = str.nextToken();    
                time = dummy.length();//Laufzeitvariable
                newformat = replace(time);
                print(newformat);
            }    
    
                buffer.close();
                reader.close();
        } 
            
        catch (IOException e) {
            
        System.err.println("Keine Datei gefunden");
        }
        
    }

    public String replace(int time){            //Methode 
        
        String dummy2;//Lokale Stringvariable
    
    
        for (int i = 0; i < time; ++i){
                dummy2 = oldformat.replace(point, comma);
                newformat = dummy2.replace(solidus,point);    
                            
        }
            ausgabe = dateparser (newformat);    
                    
            return ausgabe;
    }
    
    public String dateparser (String newformat){
        
        int k = 0; 
        
        char a [] = new char[8]; 
        char b [] = new char[8]; 
        
        String parsedate; 
        String subdate;
        
        StringBuffer str = new StringBuffer(newformat);    // Hier wird das Objekt str erzeugt
        
        for (int j=0;j<str.length();++j){
            
            if (str.charAt(j) == point && k ==0){
                   ++k;
            subdate = newformat.substring(j-2, j+6); //Erstellung des Substrings Datum mm.dd.yy
                
            for (int c = 0; c < a.length; ++c){  //Positionsveraenderung der Character von mm.dd.yy zu dd.mm.yy
                    
            a[c]= subdate.charAt(c);
            b[c]= subdate.charAt(c);
            
            }    
                    a[0]= b[3];
                    a[1]= b[4];
                    a[3]= b[0];
                    a[4]= b[1];
                    //Loeschen des alten Datums und Einfuegen des neuen Datums in den StringBuffer
                    parsedate  = new String(a);
                    str.delete(j-2, j+2);
                    str.replace(j-2, j+2, parsedate);
             }
              else {}
        }
                dategerman = str.toString();//Parsen des StringBuffers in Ausgabestring
                
        --k;
        return dategerman;
    }
    
    
    public void print(String format) {
            
        try {
            
            FileWriter writer = new FileWriter ("Format.txt");
            BufferedWriter buffer = new BufferedWriter (writer);
            buffer.write(format);
            //buffer.append( System.getProperty("line.separator") );
            
            buffer.close();
            writer.close();
        } 
        
        catch (IOException e) {

        e.printStackTrace();
        }
        System.out.println(format);
        
    }
        public static void main(String[] args) {
            Parser norm = new Parser();
            norm.read();
        }

}
```


----------



## maki (20. Apr 2009)

Da es sich hierbei um eine Frage bzw. Problem handelt und nicht um Codeschnippsel bzw. ein Projekt habe ich es verschoben.


----------



## foobar (20. Apr 2009)

Sollen wir zuerst den Fehler erraten, dann eine Frage stellen und die dann selber beantworten oder beschreibst du uns den Fehler kurz?


----------



## Deepdish (20. Apr 2009)

Es wäre nett, den Fehler zu festzustellen. Dann zu Antworten, denn ich weiss gar nicht weiter. Bin verzweifelt!!!


----------



## maki (20. Apr 2009)

"Fehler"

Geht was nicht? Wenn ja, was?
Bekommst du eine fehlermeldung? Wenn ja, welche?


----------



## SlaterB (20. Apr 2009)

edit: doch übertrieben von mir, Posting gelöscht


----------



## Deepdish (20. Apr 2009)

Der Filewriter schreibt nicht ordnungsgemäß in die neue datei "Format.txt" diese drei zeilen:
"1,5",10,100,"3,14"
"Text","123,46","zweiundvierzig",31.12.79
1,"1,1","1,2","1,3"

die geparst werden sollen. Er schreibt nur die letzte Zeile in die Datei Format.txt 1,1,1,1,2,1,3 , aber auch ohne den Häkchen.


----------



## JanHH (21. Apr 2009)

Nimm doch mal einen debugger und guck Dir genau an was Dein Programm so tut. ich finde das alles etwas zu konfus, um es mal so eben nachvollziehen zu können. Die Aufgabenstellung ist allerdings auch konfus: Um ein Element der CSV-Datei konvertieren zu können, muss man ja erstmal wissen, worum es sich dabei überhaupt handelt. Also muss jedes Token geparst und analysiert werden, dann weiss man, was man vor sich hat, und kann es auch konvertieren. Das ist dann schon relativ aufwändig.


----------



## Ebenius (21. Apr 2009)

Ich hab dann mal den Titel des Themas korrigiert. Hab mich jetzt schon dreimal gewundert, was das ganze mit CVS zu tun hat...

Am Rande: Hast Du irgendeinen Grund, warum Du in Zeile 20 und 21 die Unicode-Notation benutzt und nicht einfach ',' und '.' schreibst? Tipp: Es gibt keinen. 

Ebenius


----------



## Deepdish (21. Apr 2009)

Hy,
also ich konnte das Problem beheben. Der fehler lag in der read methode! jehuuu

@Ebenius Was genau meinst du damit. Ich hab es geändert. Anstatt die ASCII Zeichen habe ich jetzt "," und "." initialisiert.


----------



## Ebenius (21. Apr 2009)

Deepdish hat gesagt.:


> @Ebenius Was genau meinst du damit.


Den zweiten Teil hast Du ja geändert. Mit dem ersten Teil meinte ich: Ich hab das Thema umbenannt. Du schriebst "CVS" statt "CSV" im Titel.

Schön, dass es jetzt funktioniert.

Ebenius


----------



## Deepdish (21. Apr 2009)

aaaaaaaaaaaaaaaah oooooooops ist mir gar nicht aufgefallen. Danke!


----------



## Leroy42 (22. Apr 2009)

SlaterB hat gesagt.:


> edit: doch übertrieben von mir, Posting gelöscht



... und wir dürfen jetzt nicht lachen? 

Gemein! ;(


----------

