Datei einlesen, erste und letzte Zeile überspringen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datei einlesen, erste und letzte Zeile überspringen

    Hallo,

    ich möcht gerne mit Java eine Textdatei einlesen und dabei die erste und die letzte Zeile überspringen.

    Das mit der ersten Zeile hab ich hinbekommen. Aber mit der letzten Zeile haperts.

    Quellcode

    1. BufferedReader in = null;
    2. try {
    3. File file = new File(filename);
    4. in = new BufferedReader(new FileReader(file));
    5. String line = in.readLine();
    6. // Lese alle Zeilen
    7. StringBuffer sb = new StringBuffer();
    8. while (line != null) {
    9. // Überspringe die erste Zeile
    10. if (lineCounter != 0) {
    11. sb.append(line);
    12. sb.append('\n');
    13. // Schreib in Ausgabedatei
    14. fos.write(sb.toString().getBytes());
    15. }
    16. lineCounter = lineCounter + 1;
    17. line = in.readLine();
    18. }
    19. in.close();
    20. fos.close();
    21. }except.....
    Alles anzeigen


    Wer kann helfen?
  • Ein Array halte ich auch für die beste Lösung.
    Eine andere Idee wäre es die in jedem Schleifendurchlauf die aktuellen Bytes zu speichern.
    Nach der Schleife schneidest du die letztes Bytes dann wieder ab.

    Aktuell schreibst du übrigens einen immer weiter wachsenden Inhalt bei jedem Schleifendurchlauf in die Ausgabedatei. Glaube nicht, dass dein Script so funktioniert.
    Das Schreiben solltest du also erst nach der while Schleife durchführen
  • Danke schonmal für die Hinweise. Stimmt das new Stringbuffer() hab ich in der While-Schleife gehabt, dann wird der bei jedem Durchlauf neu erzeugt.

    Die Datei hat folgenden Aufbau


    Header
    Daten
    Daten
    .......
    Footer


    Header und Footer brauch ich niocht, deshalb sollen die raus. Array wäre evtl. ok. Teilweise kommen aber 200.000 Datensätze zusammen. Ich weiss nicht, ob das im Array klappt? Habt ihr vielleicht ein Codeschnipsel?

    Gruss
    KK
  • ob du die Daten im StringBuffer oder im Array häufst macht ja keinen großen Speicherunterschied.

    Ist eine Design Frage ob es dir wichtiger ist, den Arbeitsspeicher leer zu halten oder ob dir die Ausführzeit am Herzen liegt. Du kannst auf ein riesiges Array verzichten, wenn du jede Zeile direkt in die Datei schreibst. Kostet aber Performance.

    So in der Art hab ich es mir überlegt

    Quellcode

    1. while(line != null) {
    2. //schreibe den vorherigen string, falls einer existiert
    3. if(s != null) {
    4. fos.write(s.getBytes());
    5. }
    6. //setze erst den 2ten string
    7. if(line != null) {
    8. s = line+"\n";
    9. }
    10. //lese zeile
    11. line = in.readLine();
    12. }
    Alles anzeigen
  • Das einfachste ist es wohl trotzdem, wenn du einfach nach dem Einlesen, die letzte Zeile weglöscht.
    Der StringBuffer ist effizient, und auf solche Sachen ausgelegt.
    Damit du nicht suchen musst, kannst du dir ja einfach die Länge der letzten Zeile (+ \n) merken, und die dann ganz zum Schluß kicken:

    Quellcode

    1. int nLineLen = 0;
    2. StirngBuffer sb = new StringBuffer ();
    3. while (...getline ())
    4. {
    5. ...
    6. nLineLen = s.length () + 1;
    7. ...
    8. }
    9. sb.delete (sb.length () - nLineLen, sb.length ()); // start index, end index


    hth