Ausnahme Behandlung

Henri

Bekanntes Mitglied
Hallo Leute,

ich habe eine Frage über die bearbeitung eine csv-Datei, in der ich Name habe,
diese sind sehr unterschiedlich, ich meine das Kette-Zeichen, ich möchte die Info
in separaten Spalten in ein csv-Datei speicher.
Bis jetzt habe ich versuche es zu splitten, ich bekomme leider Problem, wenn mein
Kette-Zeichen anders aussehen.
nehmen wir an, wie haben die folgenden unterschieden Kette-Zeichen
tata~Do~465~jg.1950
tete~DÜ~678~Jg.1980
tutu~Jg.1960
tötö+titi
tyta~HH~4465~jg.1970~Hend

ich möchte in die erste Spalte die folgende Info schreiben
tata
tete
tutu
tötö+titi
tyta
zweite Spalte
Do

Null
Null
HH
Dritte Spalte
4651950
6781980
1960
Null
44651970
Wenn ich nach der Ausgabe der ersten Spalte frage , gibt er mir alles aus.
wenn ich nach der Ausgabe der zweiten Spate frage , bekomme ich den folgenden
Fehler
Java:
Do
DÜ
jg.1960
java.lang.ArrayIndexOutOfBoundsException: 1
Bis jetzt habe ich dieses gemacht, vielleicht könnte jemandem mir etwas vorschlagen.
Danke im Voraus
Java:
public class readCSVTime {
 
    public readCSVTime() {
        try {
            java.io.BufferedReader FileReader=                      //ein Reader um die Datei Zeilenweise auszulesen
                    new java.io.BufferedReader(
                        new java.io.FileReader(
                            new java.io.File("C:\\Users\\N\\Desktop\\test\\test.csv")
                        )
                    );
         
            String zeile="";
         
            while(null!=(zeile=FileReader.readLine())){         //lesen jeder Zeile
                String[] split=zeile.split("~");                //hier wird die Zeile zerlegt alsTrennzeichen
                        
                    System.out.println((split[0].split("~"))[0]);  //--> Stunde der ersten Zeit
                  
             
//                System.out.println(split[1]);                   //zweite Zeit über index 1
            }
         
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        new readCSVTime();
    }
}
 
Zuletzt bearbeitet:

Robat

Top Contributor
Das ist mEn nicht der Sinn einer CSV Datei. Es muss schon eine feste, geordnete Struktur geben.
Wenn du mal eine Spalte leer lassen willst solltest du mEn die Form der CSV Datei nicht verändern. Dann lass einen Eintrag lieber mal leer im Sinne von
Code:
val1;val2;val3
val1;;val3
 

Henri

Bekanntes Mitglied
Hallo Robat,
Danke, ich würde gern erstmal die Werte ausgeben, für das Schreiben in der CSV-Datei, sehe ich mir erst später
 

Thallius

Top Contributor
Die oben aufgeführte Form kannst du so nicht verwenden, da du niemals wissen kannst welche Spalte denn nun fehlt. Also entweder du formatierst die Datei so um wie Robat es gesagt hat oder du kannst das ganze Vorhaben vergessen.
 

Henri

Bekanntes Mitglied
Hi Thallius,
Danke, vergessen wir erstmal die Formatierung, ich möchte erstmal in der Console die Werte lesen
 

Robat

Top Contributor
Die Splits kannst du über folgenden Code ausgeben
Java:
System.out.println(Arrays.toString(splits));
 

mihe7

Top Contributor
Ich weiß zwar nicht, was der Blödsinn soll aber:
Java:
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test {
 
    public static String[] reorder(String[] row) {        
        int skip = row.length > 2 ? 2 : 1;
        String last = Stream.of(row)
            .skip(skip)
            .map(s -> s.toLowerCase().startsWith("jg.") ? s.substring(3) : s)
            .map(String::trim)
            .filter(s -> !s.isEmpty())
            .filter(x -> Character.isDigit(x.charAt(0)))
            .collect(Collectors.joining());

        String[] result = new String[3];
        result[0] = row[0];
        result[2] = last.isEmpty() ? null : last;
        if (skip == 2) {
            result[1] = row[1];
        }
        return result;  
    }
     
    public static void main(String[] args) throws Exception {
        String str = "tata~Do~465~jg.1950\ntete~DÜ~678~Jg.1980\ntutu~Jg.1960\n" +
            "tötö+titi\ntyta~HH~4465~jg.1970~Hend\n";
        new BufferedReader(new StringReader(str)).lines()
            .filter(l -> !l.isEmpty())
            .map(l -> l.split("~"))
            .map(Test::reorder)
            .map(Arrays::toString)
            .forEach(System.out::println);
    }
}

EDIT: Code verkürzt.
 

Robat

Top Contributor
Zum auslesen der CSV-Datei sollte folgender Code funktionieren. Du müsstest den StringReader eben entsprechend durch einen FileReader erstzen ...
Java:
try(BufferedReader reader = new BufferedReader(new StringReader(data)) {
    String line = "";
    while((line = reader.readLine()) != null) {
        String[] splits = line.split("~");
        System.out.println(Arrays.toString(splits));
    }
}catch(IOException e) {...}
Ich würde wie gesagt die Struktur der CSV Datei klar definieren .. sonst wird spätestens der nächste mit dem Projekt Probleme kriegen...
Auch wenn es mit @mihe7 Code funktionieren mag
 
Zuletzt bearbeitet:

Henri

Bekanntes Mitglied
Hallo Mihe7,
ich möchte dich noch mal stören, bezüglich deinen Code was du hier vorgeschlagt hat,
wenn ich den Jahrgang vor haben würde , wie kann ich es machen? ich habe versuche deinen Code zu ändern leider nicht geschafft kannst du mir bitte noch mal dafür helfen ?
Also ich meine so
Dritte Spalte
1950465
1980678
1960
Null
19704465
 

mihe7

Top Contributor
Java:
import java.io.*;
import java.util.*;
import java.util.stream.*;

public class Test {

    public static <R> Stream<R> streamOf(Iterator<R> it) {
          return StreamSupport.stream(
              Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED), false);
    }


    public static <R> Stream<R> reverse(Stream<R> s) {
        return streamOf(s.collect(Collectors.toCollection(ArrayDeque::new)).descendingIterator());
    }

    public static String[] reorder(String[] row) {
        int skip = row.length > 2 ? 2 : 1;
        String last = reverse(Stream.of(row)
            .skip(skip)
            .map(s -> s.toLowerCase().startsWith("jg.") ? s.substring(3) : s)
            .map(String::trim)
            .filter(s -> !s.isEmpty())
            .filter(x -> Character.isDigit(x.charAt(0))))
            .collect(Collectors.joining());

        String[] result = new String[3];
        result[0] = row[0];
        result[2] = last.isEmpty() ? null : last;
        if (skip == 2) {
            result[1] = row[1];
        }
        return result;
    }

    public static void main(String[] args) throws Exception {
        String str = "tata~Do~465~jg.1950\ntete~DÜ~678~Jg.1980\ntutu~Jg.1960\n" +
            "tötö+titi\ntyta~HH~4465~jg.1970~Hend\n";
        new BufferedReader(new StringReader(str)).lines()
            .filter(l -> !l.isEmpty())
            .map(l -> l.split("~"))
            .map(Test::reorder)
            .map(Arrays::toString)
            .forEach(System.out::println);
    }
}

Besser wäre es, eigenen Code zu verwenden, den Du dann auch verstehst.
 

Henri

Bekanntes Mitglied
Ja,
hast du recht,
übrigens die Ausgabe bleibt das gleiche und zwar
[tata, Do, 4651950]
[tete, DÜ, 6781980]
[tutu, null, 1960]
[tötö+titi, null, null]
[tyta, HH, 44651970]
so hätte ich gehofft
[tata, Do, 1950465]
[tete, DÜ, 1980678]
[tutu, null, 1960]
[tötö+titi, null, null]
[tyta, HH, 19704465]
 

mihe7

Top Contributor
Du musst schon das ausführen, was ich Dir schreibe. Der letzte Code spuckt aus:
Code:
[tata, Do, 1950465]
[tete, DÜ, 1980678]
[tutu, null, 1960]
[tötö+titi, null, null]
[tyta, HH, 19704465]
und das hat verblüffende Ähnlichkeit mit dem, was Du wolltest.
 

Ähnliche Java Themen

Neue Themen


Oben