siziwi: Linie aus Textdatei löschen

Guten Tag

Habe ein Perl-Skript geschrieben, welches mir Textdateien verarbeitet. Es wird die erste Zeile ausgelesen und als neuer Dateiname verwendet.
Jetzt möchte ich noch einige unnötigen Zeilen dieser Textdateien löschen. Gibt es dazu eine geeignete Funktion?

Habe dazu schon einiges gefunden, welches aber darauf beruht Zeile für Zeile in ein Array zu lesen und dann nur die gewünschten Zeile in die neue Textdatei speichert. Möchte dies aber nicht so lösen.

vielen Dank für die Antworten.
gruess
siziwi

  1. Hallo siziwi!

    Habe ein Perl-Skript geschrieben, welches mir Textdateien verarbeitet. Es wird die erste Zeile ausgelesen und als neuer Dateiname verwendet.
    Jetzt möchte ich noch einige unnötigen Zeilen dieser Textdateien löschen. Gibt es dazu eine geeignete Funktion?

    Es gibt sicher verschiedene Möglichkeiten, was hast Du bisher probiert? Was meinst Du mit »löschen«? Soll die Datei dann neu geschrieben werden? Oder sollen die nicht benötigten Zeilen neim Einlesen lediglich ignoriert werden?

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --
    _ - jenseits vom delirium - _

       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
    1. Hallo

      Es gibt sicher verschiedene Möglichkeiten, was hast Du bisher probiert?

      Habe bis jetzt noch nichts konkretes probiert.

      Was meinst Du mit »löschen«? Soll die Datei dann neu geschrieben werden?

      Sie wird mit der Funktion rename "neu geschrieben" (umbenennt)

      Oder sollen die nicht benötigten Zeilen neim Einlesen lediglich ignoriert werden?

      wäre auch eine Lösung, aber da die Datei nicht eingelesen wird (nur die erste Zeile für den Dateinamen) macht es wohl weniger Sinn.

      Toll wäre eine Funktion, die mir eine bestimmte Zeile aus der Datei löscht.

      Vielen Dank für die schnelle Antwort
      gruess
      siziwi

      1. Hallo siziwi!

        Was meinst Du mit »löschen«? Soll die Datei dann neu geschrieben werden?
        Sie wird mit der Funktion rename "neu geschrieben" (umbenennt)

        rename ist hierfür nicht notwendig (es sei denn Du willst die Datei wirklich verschieben/umbenennen).

        wäre auch eine Lösung, aber da die Datei nicht eingelesen wird (nur die erste Zeile für den Dateinamen) macht es wohl weniger Sinn.

        Wenn die erste Zeile eingelesen wird, wird wohl die Datei zum Lesen geöffnet, oder?

        Toll wäre eine Funktion, die mir eine bestimmte Zeile aus der Datei löscht.

        Die müsstest Du Dir selbst schreiben. Stichwörter: while, next - und open() in SELFHTML.

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --
        _ - jenseits vom delirium - _

           Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
        1. Hallo Patrick

          Was meinst Du mit »löschen«? Soll die Datei dann neu geschrieben werden?
          Sie wird mit der Funktion rename "neu geschrieben" (umbenennt)

          rename ist hierfür nicht notwendig (es sei denn Du willst die Datei wirklich verschieben/umbenennen).

          Ja die Datei soll und wir umbenennt.

          Wenn die erste Zeile eingelesen wird, wird wohl die Datei zum Lesen geöffnet, oder?

          Genau die Datei wird zum Lesen geöffnet mit "open".

          Toll wäre eine Funktion, die mir eine bestimmte Zeile aus der Datei löscht.

          Die müsstest Du Dir selbst schreiben. Stichwörter: while, next - und open() in SELFHTML.

          Also das heisst konkret, dass ich nicht drumherum komme eine Datei vollständig auszulesen und dann nur die benötigten Dateien zu schreiben. Es ist also nicht möglich bei einer geöffneten Datei einzelne Linien heraus zu löschen?

          Vielen Dank
          siziwi

          Viele Grüße aus Frankfurt/Main,
          Patrick

          1. Hallo siziwi!

            Es ist also nicht möglich bei einer geöffneten Datei einzelne Linien heraus zu löschen?

            Um eine (bestimmte) Zeile löschen zu können, musst Du sie kennen. Also kommst Du nicht drum herum, die ganze Datei einzulesen. Es sei denn, du brauchst wirklich nur die erste Zeile, und exit()test das Skript/die Routine nach getaner arbeit. Aber: Solange Du uns kein Beispiel dessen zeigst, wie Deine Datei aussieht, werden wir auch nur die Kristallkugel zu Hilfe holen können...

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --
            _ - jenseits vom delirium - _

               Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
            1. Hallo Patrick

              Um eine (bestimmte) Zeile löschen zu können, musst Du sie kennen. Also kommst Du nicht drum herum, die ganze Datei einzulesen. Es sei denn, du brauchst wirklich nur die erste Zeile, und exit()test das Skript/die Routine nach getaner arbeit. Aber: Solange Du uns kein Beispiel dessen zeigst, wie Deine Datei aussieht, werden wir auch nur die Kristallkugel zu Hilfe holen können...

              Die erste Zeile brauche ich!
              Auch kenne ich die Zeilen, welche immer gelöscht werden sollten (immer gleiche Zeilennummer)

              Hier eine Beispieldatei:

                
              Grenzgänger  
                
                
              Master Index    Nearest Caches  
                
              Grenzgänger Weiherpark 1.5/1  
              N47° 12.615  E8° 28.696 (WGS84)  
              Use waypoint: GC1H0RX  
              Size: Small    Hidden on 10.11.2008
              

              Gelöscht werden sollten Zeilen 1-6.

              viele gürsse
              siziwi

              1. Hallo siziwi!

                Gelöscht werden sollten Zeilen 1-6.

                1. Grenzgänger
                2.
                3.
                4. Master Index    Nearest Caches
                5.
                6. Grenzgänger Weiherpark 1.5/1
                7. N47° 12.615  E8° 28.696 (WGS84)
                8. Use waypoint: GC1H0RX
                9. Size: Small    Hidden on 10.11.2008

                Diese Datei hat neun Zeilen. Du willst die erste behalten und dann doch 1-6 löschen? Sorry, aber ich verstehe das nicht.

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --
                _ - jenseits vom delirium - _

                   Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
                1. Hallo siziwi!

                  Gelöscht werden sollten Zeilen 1-6.

                  Ganz Genau!

                  1. Grenzgänger
                  2. Master Index    Nearest Caches
                  3. Grenzgänger Weiherpark 1.5/1
                  4. N47° 12.615  E8° 28.696 (WGS84)
                  5. Use waypoint: GC1H0RX
                  6. Size: Small    Hidden on 10.11.2008

                  Diese Datei hat neun Zeilen. Du willst die erste behalten und dann doch 1-6 löschen? Sorry, aber ich verstehe das nicht.

                  Also die Datei wird geöffnet und dann die erste Zeile ausgelesen und als neuer Dateiname verwendet (Die Datei wird mit rename dabei noch an einen anderen Platz verschoben). Danach können Zeile 1-6 gelöscht werden. Die Datei wäre eigentlich noch viel länger, habe nur die ersten paar Zeilen gepostet.

                  Viele Grüsse
                  siziwi

                  1. Hallo siziwi!

                    Also die Datei wird geöffnet und dann die erste Zeile ausgelesen und als neuer Dateiname verwendet (Die Datei wird mit rename dabei noch an einen anderen Platz verschoben). Danach können Zeile 1-6 gelöscht werden. Die Datei wäre eigentlich noch viel länger, habe nur die ersten paar Zeilen gepostet.

                    Also, alles in einem Vorgang zu realisieren wird vermutlich nicht klappen. Du wirst nicht (denke ich) nicht umhin kommen, zwei mal open() zu bemühen: Einmal lesen, den gewünschten Namen aus der ersten Zeilen ermitteln, ein zweites Mal um neu zu schreiben, nachdem die zu löschenden Zeilen weg sind. Sicher ist Tie::File dabei eine Hilfe.

                    Richtige™ Perler mögen uns einen besseren Weg zeigen ;)

                    Viele Grüße aus Frankfurt/Main,
                    Patrick

                    --
                    _ - jenseits vom delirium - _

                       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
  2. Habe dazu schon einiges gefunden, welches aber darauf beruht Zeile für Zeile in ein Array zu lesen und dann nur die gewünschten Zeile in die neue Textdatei speichert. Möchte dies aber nicht so lösen.

    Kommt darauf an wie du bisher dein File geöffnet hast.

    traditionell

    open($fh, '<',$file ) or die("$!");
    while(<$fh>){
      /^$/ and next;
      #...
      push @array,$_;
    }

    oder mit Tie::File

    tie( my @arr,'Tie::File', $file) or die ("$!");
      # mach was mit @ array
      # am Ende:
    @arr = grep( /./) @arr; #kopiert nur nicht leere Zeilen
    untie(@arr);

    mfg Beat;

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. Habe dazu schon einiges gefunden, welches aber darauf beruht Zeile für Zeile in ein Array zu lesen und dann nur die gewünschten Zeile in die neue Textdatei speichert. Möchte dies aber nicht so lösen.

      Kommt darauf an wie du bisher dein File geöffnet hast.

      traditionell

      open($fh, '<',$file ) or die("$!");
      while(<$fh>){
        /^$/ and next;
        #...
        push @array,$_;
      }

      Habe es mit open geöffnet und die erste Zeile ausgelesen (Diese wird benötigt, kann aber nach erfolgreichem auslesen mit den anderen 6 ersten Zeile gelöscht werden).

      oder mit Tie::File

      tie( my @arr,'Tie::File', $file) or die ("$!");
        # mach was mit @ array
        # am Ende:
      @arr = grep( /./) @arr; #kopiert nur nicht leere Zeilen
      untie(@arr);

      Aber so wie ich das beurteilen kann, beruhen beide Varianten darauf, dass die ganze Datei in ein Array geschrieben wird und dann die Veränderungen durchgeführt werden und erst ganz am Schluss die neue Datei geschrieben wird.
      Gibt es aber auch eine Möglichkeit, wobei nicht die ganze Datei in ein Array übernommen wird? Denn die Dateien haben ziemlich viele Zeilen....

      Viel Grüsse
      siziwi

      1. Aber so wie ich das beurteilen kann, beruhen beide Varianten darauf, dass die ganze Datei in ein Array geschrieben wird und dann die Veränderungen durchgeführt werden und erst ganz am Schluss die neue Datei geschrieben wird.
        Gibt es aber auch eine Möglichkeit, wobei nicht die ganze Datei in ein Array übernommen wird? Denn die Dateien haben ziemlich viele Zeilen....

        Gerade dazu ist Tie::File ein prädestiniertes Modul, denn es wird eben nicht der ganze Array in den Speicher geholt. Ich verwende das Modul für jedes File mit Wachstumspotential.

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        1. Gerade dazu ist Tie::File ein prädestiniertes Modul, denn es wird eben nicht der ganze Array in den Speicher geholt. Ich verwende das Modul für jedes File mit Wachstumspotential.

          Vielen Dank, werde dies einmal genauer betrachten und ausprobieren.

          Grüsse
          siziwi