Datei einlesen mit generics?

Migu

Mitglied
Hallo

ich stehe hier vor einem Problem wo ich nicht mehr weiter komme.
Ich will eine normalen Textdatei einlesen die so aussieht (Auschnitt):
Java:
1961012406      80      3.1
1961012407      60      3.1
1961012408      60      3.1
1961012409      80      3.1
1961012410      70      3.1
1961012411      70      4.1
1961012412      70      4.1
1961012413      80      2.6

So die drei Spalten will ich automatisch in drei verschidenen Listen speichern, jeweils als String, Integer und Double.
Meine Hauptklasse sieht so aus:
Java:
import java.io.FileNotFoundException;
import java.util.ArrayList;


public class ReadFile {
    
    public static void main(String[] args) throws FileNotFoundException {

        String file = "/home/migu/Desktop/input.txt";
        
        ArrayList<Object> vec1 =  new ArrayList<>();
        ArrayList<Object> vec2 =  new ArrayList<>();
        ArrayList<Object> vec3 =  new ArrayList<>();
        AsciiFileReader a = new AsciiFileReader(file);
        a.read("s,i,f", vec1,vec2,vec3);
        
    }
}

Um die Datei zu lesen hab ich mir eine Klasse geschrieben "AsciiFileReader", dass mir die einzelnen Spalten in verschiedenen Listen speichert.
Dazu muss ich nur bei der "read"-Funktion eine Formatangabe und die Listen übergeben.
Die Klasse sieht so aus:
Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;


public class AsciiFileReader {

    private String filename;
    private File currentFile;
    private String delimiter = " ";
    private String format;
    
    public AsciiFileReader() {
    }
    
    public AsciiFileReader(final String filename) {
        this.filename = filename;
        this.currentFile = new File(filename);
    }
    
    public AsciiFileReader(final File file) {
        this.currentFile = file;
        this.filename = file.getAbsolutePath();
    }
    
    public void read(final String format,ArrayList<Object>... args) throws FileNotFoundException {
        this.format = format;
        String[] splittedFormat = splitFormat(this.format);
        
        Scanner scanner = new Scanner(this.currentFile);
        scanner.useDelimiter(toRegularExpr(this.delimiter));
        while (scanner.hasNext()) {
            getData(scanner, splittedFormat, args);
        }
        
    }
    
    public void setDelimiter(final String delimiter) {
        this.delimiter = toRegularExpr(delimiter);
    }
    
    private void getData(Scanner scanner, final String[] splittedFormat, ArrayList<Object>... args) {
        int i = 0;
        for (ArrayList<Object> list : args) {
            switch (splittedFormat[i]) {
                case "s":
                    list.add(scanner.next());
                    break;
                case "i":
                    list.add(scanner.next());
                    break;
                case "f":
                    list.add(scanner.next());
                    break;
            }
            i++;
        }
    }
    
    private String[] splitFormat(final String format) {
        return format.split("\\,");
    }
    
    private String toRegularExpr(final String expr) {
        String regExpr = "";
        switch (expr) {
            case " ":
                regExpr = "\\s+";
                break;
            default:
                regExpr = "\\" + expr;
        }
        return regExpr;
    }
    
}

Das einlesen funktioniert problemlos aber ich kann momentan die Daten nur als Object einlesen. Es soll aber eben anhand des Formatstrings automatisch das richtige Format gewählt werden.
Dies soll in der Funktion "getData" passieren.

Ich dachte dass es mit Object klappt aber wenn ich in der Hauptklasse die Listen mit String, Integer und Double definiere dann bekomme ich als Fehlermeldung
Java:
Erroneous sym type

MIt Generics, oder zumindestens dass was ich ausprobiert hatte, funktionierts auch nicht, weil dann habe ich ja auch immer den selben "Generic-Typ".

Hat jemand ein Idee wie das Problem lösbar sein könnte.

Gruss
MIgu
 

Migu

Mitglied
Ein kurze Ergänzung:

in der Funktion "getData" soll später anstatt überall

Java:
scanner.next()

natürlich formatspezifisch, je nachdem ob s, i oder f

Java:
scanner.next()
scanner.nextInt()
scanner.nextDouble()

stehen.
Das habe ich nur jetzt weggelassen weil sonst das Program nicht ausführbar ist.
 

Michael...

Top Contributor
in Deiner read Methode ist der Parameter als
Code:
ArrayList<Object>
definiert, da werden eben nur solche Objekte aktzeptiert. Funktionieren würde es mit
Code:
ArrayList<? extends Object>
oder besser
Code:
List<? extends Object>
. Aber da könnte man sich ja auch gleich die Parametrisierung sparen und einfach nur
Code:
ArrayList
verwenden.

Stehen die Werte eine Spalte nicht zu einander in Bezug? Sollte man diese nicht besser zusammen in ein Objekt speichern?
 

Migu

Mitglied
in Deiner read Methode ist der Parameter als
Code:
ArrayList<Object>
definiert, da werden eben nur solche Objekte aktzeptiert. Funktionieren würde es mit
Code:
ArrayList<? extends Object>
oder besser
Code:
List<? extends Object>
. Aber da könnte man sich ja auch gleich die Parametrisierung sparen und einfach nur
Code:
ArrayList
verwenden.

Stehen die Werte eine Spalte nicht zu einander in Bezug? Sollte man diese nicht besser zusammen in ein Objekt speichern?

Meinst du sowas wie eine Map? Das würde gehen aber die Daten brauche ich in Vektoren/Lists.


Wenn ich die Funktionen so ändere dass überall
Code:
ArrayList
anstatt
Code:
ArrayList<Object>
steht, und meine getData-Funktion folgendermaßen ändere

Java:
private void getData(Scanner scanner, final String[] splittedFormat, ArrayList... args) {
        int i = 0;
        for (ArrayList list : args) {
            switch (splittedFormat[i]) {
                case "s":
                    list.add(scanner.next());
                    break;
                case "i":
                    list.add(scanner.nextInt());
                    break;
                case "f":
                    list.add(scanner.nextDouble());
                    break;
            }
            i++;
        }
    }


dann bekomme ich eine
Code:
InputMismatchException
.

Auch wenn ich
Code:
ArrayLIst<? extends Object>
angebe ändert sich nichts.
Ich sehe da kein Fehler.
Meine Hauptklasse habe ich auch geändert

Java:
import java.io.FileNotFoundException;
import java.util.ArrayList;


public class ReadFile {
    
    public static void main(String[] args) throws FileNotFoundException {

        String file = "/home/migu/Desktop/input.txt";
        
        ArrayList<String> vec1 =  new ArrayList<>();
        ArrayList<Integer> vec2 =  new ArrayList<>();
        ArrayList<Double> vec3 =  new ArrayList<>();
        AsciiFileReader a = new AsciiFileReader(file);
        a.read("s,i,f", vec1,vec2,vec3);
       
    }
}

Woran kann es scheitern?

Danke scho mal
Migu
 

Migu

Mitglied
OK hat sich erledigt. Klappt alles wie gewollt wenn ich meine getData-Funktion wie folgt ändere
Java:
private void getData(Scanner scanner, final String[] splittedFormat, ArrayList... args) {
        int i = 0;
        for (ArrayList list : args) {
            switch (splittedFormat[i]) {
                case "s":
                    list.add(scanner.next().toString());
                    break;
                case "i":
                    list.add(Integer.parseInt(scanner.next()));
                    break;
                case "f":
                    list.add(Double.parseDouble(scanner.next()));
                    break;
            }
            i++;
        }
    }

warum allerdings es mit zB
Code:
Integer.parseInt(scanner.next())
und nicht mit
Code:
scanner.nextInt()
funktioniert ist mir noch ein rätsel.
Vielleicht kann das einer auflösen!?

Migu
 
V

vanny

Gast
Du solltest dir dennoch überlegen, die zusammengehörigen Daten in einem eigenen Objekt zu speichern.
Ist IMHO übersichtlicher, und leichter zu händeln.

Welchen Grund hast du denn, das in 3 separate Listen aufzudröseln? ???:L

Gruß Vanny
 

Guardi

Bekanntes Mitglied
nextInt liefert den primitiven Datentyp int.
parsenInt liefert ein Integer Objekt. Da deine Liste ein Objekt erwartet funktioniert dies nur über ein solches Wrapper Objekt.
 

Migu

Mitglied
Du solltest dir dennoch überlegen, die zusammengehörigen Daten in einem eigenen Objekt zu speichern.
Ist IMHO übersichtlicher, und leichter zu händeln.

Welchen Grund hast du denn, das in 3 separate Listen aufzudröseln? ???:L

Gruß Vanny

Klar kann ich auch eine HashMap nehmen, dagegen spricht garnichts.
Die Grundidee der Klasse war aber erstmal die read-Funktion von FORTRAN in Java zu implementieren.
Allerdings ist die Klasse noch sehr rudimentär, und da sollen noch andere Möglichkeiten hinzukommen, unter anderem (warum nicht) auch die ganzen Daten in einem Object abzuspeichern.

nextInt liefert den primitiven Datentyp int.
parsenInt liefert ein Integer Objekt. Da deine Liste ein Objekt erwartet funktioniert dies nur über ein solches Wrapper Objekt.

Ah ja, dann ist es klar. Danke fürs aufklären!

Migu
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
L Input/Output XML Datei einlesen (JAXB?) Java Basics - Anfänger-Themen 10
F Zahlen aus Datei einlesen und in Array speichern Java Basics - Anfänger-Themen 2
I Datei einlesen Java Basics - Anfänger-Themen 11
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
K Datei aus unbekannten Speicherorten einlesen Java Basics - Anfänger-Themen 1
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
E Erste Schritte txt.Datei mit BufferedReader einlesen und in 2D-Array abspeichern Java Basics - Anfänger-Themen 15
M Methoden Datei einlesen und als return übergeben. Java Basics - Anfänger-Themen 8
P CSV Datei einlesen und damit ein Datenmodell befüllen Java Basics - Anfänger-Themen 2
N Datei einlesen und grafisch anzeigen Java Basics - Anfänger-Themen 31
P csv Datei einlesen und ausgeben Java Basics - Anfänger-Themen 5
J Text Datei einlesen Java Basics - Anfänger-Themen 6
N gerichteter Graph aus einer Datei einlesen Java Basics - Anfänger-Themen 21
E Datei einlesen und bestimmte Wörter ausgeben Java Basics - Anfänger-Themen 2
Z Erste Schritte Versuche ein Labyrinth in einem Terminal zu erstellen, aber kann die properties Datei nicht einlesen Java Basics - Anfänger-Themen 3
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
V Excel Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 4
stylegangsta Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen Java Basics - Anfänger-Themen 5
N Mehrdimensionales float Array aus .txt-Datei einlesen? Java Basics - Anfänger-Themen 17
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
J CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 10
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Datei einlesen - Dateipfad unter Linux anpassen Java Basics - Anfänger-Themen 12
A Datei in Array einlesen Java Basics - Anfänger-Themen 6
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
Ananaskirsche Input/Output Bestimmte Zeile aus Datei einlesen Java Basics - Anfänger-Themen 4
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
M CSV-File aus datei system einlesen Java Basics - Anfänger-Themen 3
B Datei in Java einlesen Java Basics - Anfänger-Themen 13
S Datei einlesen und ausgeben Java Basics - Anfänger-Themen 8
S Input/Output einlesen aus einer evtl. leeren Datei Java Basics - Anfänger-Themen 5
J Input/Output Datei - Zeilenumbruch einlesen Java Basics - Anfänger-Themen 10
H config Datei erstellen + einlesen Java Basics - Anfänger-Themen 15
F Datei einlesen ( Bytes ) Java Basics - Anfänger-Themen 12
T Klassen CSV datei einlesen und parsen Java Basics - Anfänger-Themen 4
U Datei einlesen Java Basics - Anfänger-Themen 9
S ANSI-Datei einlesen UND UTF-8-Datei schreiben Java Basics - Anfänger-Themen 3
I Datei einlesen, Inhalt in MAP ablegen Java Basics - Anfänger-Themen 10
A Erste Schritte Datei einlesen und Buchstaben zählen Java Basics - Anfänger-Themen 13
D txt-Datei zeilenweise als String einlesen Java Basics - Anfänger-Themen 2
E JPane txt datei einlesen Java Basics - Anfänger-Themen 5
D RegExp .txt-Datei einlesen Java Basics - Anfänger-Themen 6
M Datei Einlesen Fortan-Style? Java Basics - Anfänger-Themen 3
A Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 5
S Datei einlesen Java Basics - Anfänger-Themen 21
D Datei einlesen Fehler Java Basics - Anfänger-Themen 17
A Beim txt Datei einlesen kommen zusätzliche Lehrzeichen dazu. Java Basics - Anfänger-Themen 5
H eine Datei schnellstmöglich einlesen Java Basics - Anfänger-Themen 12
0 Log4J Probleme beim einlesen der Log datei Java Basics - Anfänger-Themen 2
E Input/Output Linux datei in Windows zeilenweise einlesen Java Basics - Anfänger-Themen 4
S XML Datei einlesen und Elemente ausgeben Java Basics - Anfänger-Themen 4
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
S Datenströne - Text in eine Datei einlesen, umwandeln und in eine neue Datei schreiben Java Basics - Anfänger-Themen 6
E externe .txt Datei mit Scanner einlesen Java Basics - Anfänger-Themen 7
N Input/Output .txt-Datei einlesen, aufteilen und seperat abspeichern Java Basics - Anfänger-Themen 3
L Datei einlesen Java Basics - Anfänger-Themen 12
L Input/Output Datei in Java einlesen Java Basics - Anfänger-Themen 9
J Datei einlesen Java Basics - Anfänger-Themen 10
I .csv-Datei einlesen klappt aber kann nicht in String geschrieben werden!?!?! Java Basics - Anfänger-Themen 11
S Datei einlesen und Ergebnis wieder in Datei schreiben Java Basics - Anfänger-Themen 5
J Datei einlesen teile aus lines ändern und wieder rausschreiben. Java Basics - Anfänger-Themen 4
B Wertetabelle mit versch. Formaten aus txt-Datei einlesen Java Basics - Anfänger-Themen 2
H 200000 Zeilen aus Datei einlesen Java Basics - Anfänger-Themen 13
D CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 23
J byteweise Einlesen einer Datei "Von.. bis.." Java Basics - Anfänger-Themen 3
J Einlesen/Speichern von Strings aus einer Datei Java Basics - Anfänger-Themen 15
Z CSV-Datei einlesen mit dem JFileChooser !!! Java Basics - Anfänger-Themen 5
H Einlesen einer CSV-Datei Java Basics - Anfänger-Themen 2
X einlesen aus Datei, Fehler Java Basics - Anfänger-Themen 9
S Einlesen einer Datei? Java Basics - Anfänger-Themen 9
L Datei einlesen und neu geändert ausgeben Java Basics - Anfänger-Themen 8
B Formel aus Datei einlesen und benutzen Java Basics - Anfänger-Themen 3
C Datei einlesen Java Basics - Anfänger-Themen 19
H Datei einlesen in einer MVC Anwendung Java Basics - Anfänger-Themen 3
M OutOfMemoryError beim Datei einlesen Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben