Zählen bestimmter Zeilen einer .txt

berti

Mitglied
Hallo,

bin neu hier und komme mit einem Problem nicht weiter. Ich lese Daten aus einem txt-File aus, welches so aufgebaut ist:
Code:
Table ID:   (1      )
Block Table:

   Stage  I Name I  Size  I Reference  
--------------------------------------------------
   1      I  E1  I        I               
   2      I  U5  I    8   I          
   5      I  P1  I   16   I                 
   3      I  L1  I    4   I                 
   6      I  T2  I    4   I                  
   2      I  D4  I   64   I                  
   4      I  C5  I        I                    
   5      I  T3  I    8   I                  
   2      I  B1  I    4   I                        
--------------------------------------------------
                      .
                      .                                          
--------------------------------------------------

--------------------------------------------------
Table ID:   (34     )
Block Table:

   Stage  I Name I  Size  I Reference
--------------------------------------------------
   1      I  P1  I    8   I       
   2      I  A1  I    4   I             
   5      I  S2  I        I                           
   9      I  V0  I    0   I                      
--------------------------------------------------
Es sind mehrere Tabellen enthalten die nicht fortlaufend nummeriert sind (Table ID). Ich möchte die Anzahl der Einträge (Zeilen) zu jeder Tabelle zählen. Ich hatte an eine for-Schleife gedacht, weiß nur nicht wie ich diese definieren soll damit sie beim parsen der .txt, immer nur genau die Anzahl der Zeilen zwischen den Begrenzungslinien " ----------------- " zählt.
Zur Erklärung: Ich will die Einträge jeder Tabelle genau zuordnen und in ein mehrdimensionales Array schreiben. Dazu will ich zunächst die Anzahl der Einträge jeder Tabelle zählen um die Größe des Array definieren zu können. Bin für jeden Vorschlag oder andere Ideen dankbar!
 
Das kann man sicher kompliziert parsen, aber warum überhaupt so ein Kompliziertes File? Für Programme ist das nicht sehr optimiert. Also ist das so notwendig?
 
Ja, leider...es geht ja eben darum, diese .txt, welche die Ausgaben einer Datenbank enthält in einer neuen Struktur abzuspeichern. Dachte da an XML, die eigentliche .txt enthält noch viel mehr Informationen zwischen den Tabellen, es geht mir aber erstmal nur darum die Anzahl der Einträge einer jeden Tabelle zu zählen. Andere Daten habe ich schon über reguläre Ausdrücke ausgelesen, aber beim scheinbar einfachen Zählen der Einträge scheitere ich.
 
Das Problem, im Voraus wissen zu müssen, wieviele Einträge Deine Tabelle hat, um den Array mit der richtigen Größe initialisieren zu können, hast Du nicht, wenn Du Listen verwendest. Diesen kann man einfach solange Elemente hinzufügen, wie nötig. Und wenn man am Ende unbedingt einen Array braucht, gibt es praktische Konvertierungsfunktionen. Also:
- Das List Interface
- Die ArrayList als Implementierung
- Die Methode(n) toArray des List-Interfaces
Das sind Deine "Freunde" 😉
 
Zuletzt bearbeitet von einem Moderator:
Danke erstmal für die schnellen Antworten. Wenn ich eine ArrayList verwende, z.B. mittels regulärer Ausdrücke soll jede Zeile die mit einer Ziffer beginnt in die Liste eingetragen werde, das funktioniert auch. Aber dann habe ich eine Liste mit mehreren 100 Einträgen und ich habe keine Zuordnung mehr welche Elemente der Liste zu der jeweiligen Tabelle gehören. Berichtigt mich bitte, wenn ich da falsch liege! Also beispielsweise zähle ich in einer 1. Liste alle Tabellen, sagen wir es werden 50 Tabellen gefunden. Und danach zähle ich alle Einträge (Zeilen) in eine 2. Liste, nur so geht mir doch wie gesagt die Zuordnung zur jeweiligen Tabelle verloren. Irgendwie steh ich da grad voll auf dem Schlauch....
Werd mich aber noch weiter mit den Listen befassen, vllt. steig ich ja noch dahinter....für weitere Tipps bin ich offen!
 
Also hab es jetzt über ArrayList gelöst...für mich so erstmal die beste Lösung, danke für die Tipps.
Hier mein Code dazu:
Java:
buff1 = new BufferedReader(new FileReader( fileName));
while ((str1 = buff1.readLine()) != null) {
        	    	
   String test1 = ".*?(\\s{2,3}\\d+\\s{6,7}).*?(I)";
   Pattern p1 = Pattern.compile(test1,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
   Matcher m1 = p1.matcher(str1);
   if (m1.find()) { 
        	   	    	
         String stage1=m1.group(1);
         stage1 = stage1.replaceAll("\\s","");
         list1.add(0, stage1);
    }
   if (str1.matches("-{30,}.*?")){                    //**  Liste der Felder
       if (list1.size() > 0) {

           list2.add(0, list1.size());              //**  2.Liste mit Feldern pro Table  
           list1.clear();
       }
   }
}
   System.out.println("Zahl der Felder pro Table: " + list2);
Hab die Ausgabe der Liste dann noch gedreht und als <Integer> deklariert um die Werte, wie beabsichtigt als Index verwenden zu können. Danke nochmal!
 
Zuletzt bearbeitet:

Zurück
Oben