Auf Thema antworten

Hallo Robert Zenz und M.L. auch Euch vielen Dank. Ich zeige nun mal, was ich habe, vielleicht reicht das ja schon:



[CODE=java]package csvReader;


import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;


public class CSVReader {

    private static final int MAX_RECORDS = 200;


    // TRecord-Klasse entspricht dem Pascal Record

    static class TRecord {

        int M1, M2, M3, N1, N2, L1;

        String PROG, BEZEICHNER, CODE;


        // Konstruktor für TRecord

        TRecord(int m1, int m2, int m3, String prog, String bezeichner, String code, int n1, int n2, int l1) {

            this.M1 = m1;

            this.M2 = m2;

            this.M3 = m3;

            this.PROG = prog;

            this.BEZEICHNER = bezeichner;

            this.CODE = code;

            this.N1 = n1;

            this.N2 = n2;

            this.L1 = l1;

        }


        @Override

        public String toString() {

            return "M1=" + M1 + ", M2=" + M2 + ", M3=" + M3 + ", PROG=" + PROG + ", BEZEICHNER=" + BEZEICHNER + ", CODE=" + CODE + ", N1=" + N1 + ", N2=" + N2 + ", L1=" + L1;

        }

    }


    // TDatei-Klasse entspricht der Pascal-Struktur mit RecordCount

    static class TDatei {

        List<TRecord> records = new ArrayList<>();

    }


    static TDatei datei = new TDatei(); // CSV-Daten

    static TDatei matchingRecords = new TDatei(); // Gefundene Sätze


    // Hilfsfunktion zur Konvertierung von String in Integer (Fehler wird als 0 behandelt)

    static int strToInt(String s) {

        try {

            return Integer.parseInt(s.trim());

        } catch (NumberFormatException e) {

            return 0;

        }

    }


    // Funktion zum Extrahieren eines Feldes aus einer CSV-Zeile (mit Semikolon als Trennzeichen)

//    static String csvStrip(String line) {

//        int semicolonPos = line.indexOf(';');

//        if (semicolonPos >= 0) {

//            String field = line.substring(0, semicolonPos);

//            return line.substring(semicolonPos + 1);

//        } else {

//            return line; // Letztes Feld

//        }

//    }


    // Funktion, die einen Satz basierend auf dem Index zurückgibt

    static boolean getRecordByIndex(int index, TRecord[] rec) {

        if (index >= 0 && index < datei.records.size()) {

            rec[0] = datei.records.get(index);

            return true;

        }

        return false;

    }


    // Funktion, die alle Sätze zurückgibt, die zu M1 und M2 passen

    static boolean getRecordsByKeys(int key1, int key2, TDatei resultRecords) {

        resultRecords.records.clear();

        boolean found = false;

        for (TRecord record : datei.records) {

            if (record.M1 == key1 && record.M2 == key2) {

                resultRecords.records.add(record);

                found = true;

            }

        }

        return found;

    }


    // CSV-Datei einlesen und die Daten in das Array laden, 1. Zeile überspringen

    static void loadCSV(String fileName) throws IOException {

        try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {

            String line = br.readLine(); // Überspringe die erste Zeile (Header)

            while ((line = br.readLine()) != null && datei.records.size() < MAX_RECORDS) {

                String[] fields = line.split(";");


                // Parst die Zeile und fügt den Satz der Liste hinzu

                TRecord record = new TRecord(

                    strToInt(fields[0]), // M1

                    strToInt(fields[1]), // M2

                    strToInt(fields[2]), // M3

                    fields[3],           // PROG

                    fields[4],           // BEZEICHNER

                    fields[5],           // CODE

                    strToInt(fields[6]), // N1

                    strToInt(fields[7]), // N2

                    strToInt(fields[8])  // L1

                );

                datei.records.add(record);

            }

        }

    }


    public static void main(String[] args) {

        try {

            loadCSV("daten.csv");


            // Test: Suche nach einem Datensatz über den Index

            TRecord[] rec = new TRecord[1];

            boolean found = getRecordByIndex(4, rec); // Index 4 (entspricht dem 5. Satz)

            if (found) {

                System.out.println("Datensatz 5: " + rec[0]);

            } else {

                System.out.println("Datensatz nicht gefunden.");

            }


            // Test: Suche nach Sätzen mit M1=2 und M2=3

            found = getRecordsByKeys(2, 3, matchingRecords);

            if (found) {

                System.out.println("Gefundene Datensätze für M1=2, M2=3:");

                for (TRecord record : matchingRecords.records) {

                    System.out.println(record);

                }

            } else {

                System.out.println("Keine Datensätze für M1=2, M2=3 gefunden.");

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

[/CODE]


Ein paar Methoden und etwas Logik brauche ich dann schon noch, aber die Datenbasis dürfte ich erstmal haben. Nicht wundern, ich habe die eine Methode csvStrip noch als Kommentar drin gelassen um zu zeigen, womit ich mich in den verschiedenen Sprachen herumschlagen darf.

Das csvStrip brauche ich in Pascal, ich benutze es auch in anderen Sprachen. In Java habe ich immerhin schon das .split(';') welches es im Prinzip auch in Python tun würde aber da bin ich noch bequemer und nutze das csv.DictReader. Ich muß dann aber wieder vom Komfortablen zurück gehen zur Handarbeit bzw mir in Pascal einiges selber schreiben. Habe ich nun mein Problem/meine Vorgehensweise deutlich gemacht?



Oben