Announcement

Collapse
No announcement yet.

Strings rausfiltern und ersetzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Strings rausfiltern und ersetzen

    Hallo,

    ich verfolge schon seit einiger zeit sehr interessiert euer forum. nun habe ich ein problem, und die suche konnte mir auch nicht wirklich weiterhelfen...

    habe folgendes problem:

    habe riesige txt-dateien (zwischen 1-20mb) und muss darin strings finden, umformen und wieder abspeichern.

    die datei sieht wie folgt aus:

    ...
    HMSRaVL_13 bit 2 unit= sc
    HMSRaVR_13 bit 2 unit= scc
    HMARaHL_10 bit 4 unit= sc
    HMARaHR_10 bit 5 unit= sa
    ...

    ich würde nun gerne zum beispiel alle HMS heraussuchen und durch AMP ersetzen. In diesem Beispiel also

    AMPRaVL_13 bit 2 unit= sc
    AMPRaVR_13 bit 2 unit= scc
    HMARaHL_10 bit 4 unit= sc
    HMARaHR_10 bit 5 unit= sa


    wie kann ich sowas realisieren? hat jemand erfahrungen damit?? ich hab irgendwie probleme mit den teilstrings, weil ich ja nur nach bestimmten buchstabenkombinationen pro zeile suche... hoffe, das war verständlich...

    mein ansatz war bisher bisher die datei in ein array zu laden und mit if zu durchsuchen, was aber nicht geklappt hat... weiss auch nicht woran es liegt...

    hoffe, auf eine baldige antwort!!


    grüße

  • #2
    mein ansatz war bisher bisher die datei in ein array zu laden und mit if zu durchsuchen, was aber nicht geklappt hat... weiss auch nicht woran es liegt...
    Das ist kein Fehler.

    Bei 20 Mb würde ich folgenden Ansatz verfolgen

    Quelldatei öffnen,
    Zieldatei anlegen,
    eine Zeile aus der Quelldatei lesen
    ggf. Ersetzungen vornehmen
    Zeile in die Zieldatei schreiben

    Suchen und Ersetzen macht man in PERL mit regulären Ausdrücken

    http://www.informatik.uni-frankfurt..../perl_reg.html
    Christian

    Comment


    • #3
      vielen dank...

      habe aber noch das problem, dass ich keine treffer finde...


      hier mein code:


      foreach $i(0..$#myscript)
      {
      if (@myscript=~m/HMS/)
      {
      print "HMS matched\n";
      }

      if (@myscript=~m/VKKLS/)
      {
      print "VKKLS matched\n"
      }


      ich versteh das nicht... ich lade meinen text in das array, und durchlaufe eine schleife für jede zeile, oder? aber irgendwie findet er keine treffer... sieht jemand hier einen fehler??

      Comment


      • #4
        /HMS/ -> Deine Zeile besteht ja wohl aus noch mehr Zeichen

        /HMS.*/
        Christian

        Comment


        • #5
          Auch hallo,
          habe riesige txt-dateien (zwischen 1-20mb) und muss darin strings finden, umformen und wieder abspeichern.
          Unter Beachtung des richtigen Regex könnte Tie::File gute Dienste leisten: http://search.cpan.org/~mjd/Tie-File...ib/Tie/File.pm
          "(..)
          for (@array) {
          s/PERL/Perl/g; # Replace PERL with Perl everywhere in the file
          }
          (..)
          "
          MfG
          Cheat-Sheets for Developers / Programming Quotes

          Comment


          • #6
            habe nun folgendes ausprobiert:

            open(PLTFILE, "$_[0]") or die "No such file\n";
            @myscript=<PLTFILE>;
            close(PLTFILE);

            foreach $i(0..$#myscript)
            {
            if (@myscript=~m/blablabla.*/)
            {
            print "blabla matched\n";
            }
            else {
            print "blalbla unmatched\n";
            }

            er öffnet die file und gibt für jede zeile unmatched aus, obwohl einige matches drin sein müssen!!

            Comment


            • #7
              Jede Zeile beginnt mit blablabla??
              Christian

              Comment


              • #8
                nein, nein, hab mich vllt etwas undeutlich ausgedrückt mit diesem blabla... hier nochmal originaltext:

                die momentane datei sieht wie folgt aus:

                ...
                HMSRaVL_13 bit 2 unit= sc
                HMSRaVR_13 bit 2 unit= scc
                HMARaHL_10 bit 4 unit= sc
                HMARaHR_10 bit 5 unit= sa
                ...

                ich würde nun gerne zum beispiel alle HMS heraussuchen und durch AMP ersetzen. In diesem Beispiel also

                AMPRaVL_13 bit 2 unit= sc
                AMPRaVR_13 bit 2 unit= scc
                HMARaHL_10 bit 4 unit= sc
                HMARaHR_10 bit 5 unit= sa

                hoffe, dass es nun etwas klarer geworden ist...

                Comment


                • #9
                  Siehe Link Beitrag 2 -> dort wird das genau erklärt

                  Zum testen
                  http://www.fileformat.info/tool/regex.htm

                  Der Ausdruck für das Suchen lautet

                  /HMS/AMP/

                  Das ist etwas anderes als matchen. Bei Suchen willst du wissen, ob der Ausdruck irgendwo in deinem String enthalten ist. Beim matchen willst du wissen, ob dein Ausdruck dem String entspricht.

                  Aus diesem Grunde wird mit /HMS/AMP/ gesucht und ersetzt, aber mit /HMS.*/ gematcht, ob der String mit HMS beginnt und dann irgendwelche Zeichen noch kommen
                  Christian

                  Comment


                  • #10
                    hallo,

                    vielen dank für die antworten...

                    gestern abend wurde zu meinem entsetzen jedoch die aufgabe umgestellt...

                    muss nun zwei dateien einlesen, in eine temp-datei schreiben, mit dem inhalt einer anderen textdatei (in jeder zeile steht ein begriff) diese temp-datei zeile für zeile nach wörtern durchsuchen, ggfs ersetzen und dann abspeichern... wie können die einen als anfänger nur so quälen?!?

                    ich hab jetz mal versucht, zwei dateien einzulesen und als tempdatei auszugeben. allerdings erkennt er die zweite datei nicht, gibt nur aus "no such file2". ich leg mal meinen ganzen code dazu...



                    # Print text and wait for the user's input
                    print "File1 incl folder: ";

                    # Save the input1 in $file1
                    $file1 = <>;

                    # Same again
                    print "File2 incl folder: ";
                    $file2 = <>;

                    # Create both "parameters"
                    checkFile("$file1");
                    checkFile("$file2");

                    # Sub-Routine for opening up the user's input files and saving them into a temp-file
                    sub checkFile
                    {

                    # Create temporary PLT-file
                    open(PLTTEMP,">c:/lw_d/temp/plttemp.PLT");

                    # $_[0] is first "parameter-variable" (check with checkFile("$file1"))
                    open(PLTFILE1, "$_[0]") or die "No such file1\n";
                    @myscript1=<PLTFILE1>;
                    close(PLTFILE1);

                    # Saving the PLT-file2 in the myscript2-array
                    open(PLTFILE2, "$_[1]") or die "No such file2\n";
                    @myscript2=<PLTFILE2>;
                    close(PLTFILE2);

                    # Save the myscript1-array in the temp-file
                    print PLTTEMP @myscript1;
                    close(PLTTEMP);

                    # Open up the PLT-file again
                    open(PLTTEMP,">>c:/lw_d/temp/plttemp.PLT");

                    # Add the myscript2-array to the end of the PLT-temp-file
                    print PLTTEMP @myscript2;
                    close(PLTTEMP);


                    hoffe, ihr habt vllt nen lösungsansatz dazu...

                    Comment


                    • #11
                      hallo, es klappt, ich habs tatsächlich hinbekommen... allerdings will ich nun in der zusammengesetzten datei nach zwei begriffen suchen... wie mache ich das???

                      hier mein jetziger code schon mal...



                      print "\n =================================================" ;
                      print "\n --------------- File Changer --------------------";
                      print "\n =================================================\ n";

                      # Print text and wait for the user's input
                      print "File1 incl folder: ";

                      # Save the input1 in $file1
                      $file1 = <>;

                      # Same again
                      print "File2 incl folder: ";
                      $file2 = <>;

                      # Call the Subs
                      checkFile1("$file1");
                      checkFile2("$file2");

                      createPlt();
                      addPlt();


                      #================================================= ===============================================

                      # Sub to create a new temp-plt file
                      sub createPlt
                      {

                      # Create temporary PLT-file
                      open(PLTTEMP,">c:/lw_d/temp/plttemp.PLT");

                      # Save the myscript1-array in the temp-file
                      print PLTTEMP @myscript1;
                      close PLTTEMP;
                      }

                      #================================================= ===============================================

                      # Sub to add a new part to the existing plt
                      sub addPlt
                      {

                      # Open existing PLT-file
                      open(PLTTEMP,">>c:/lw_d/temp/plttemp.PLT");

                      # Save the myscript1-array in the temp-file
                      print PLTTEMP @myscript2;
                      close PLTTEMP;
                      }

                      #================================================= ===============================================

                      # Sub-Routine for opening up the user's input files and saving them into a temp-file
                      sub checkFile1
                      {

                      # $_[0] is first "parameter-variable" (check with checkFile("$file1"))
                      open(PLTFILE1, "$_[0]") or die "No such file1\n";
                      @myscript1=<PLTFILE1>;
                      close PLTFILE1;

                      # Test-routine for the array... counts the array's values
                      #$counter=@myscript;
                      #print $counter;

                      # Test-print one array-value on the screen
                      #print @myscript[84732];
                      }

                      #================================================= ===============================================

                      # Sub-Routine for opening up the user's input files and saving them into a temp-file
                      sub checkFile2
                      {

                      # $_[0] is first "parameter-variable" (check with checkFile("$file1"))
                      open(PLTFILE2, "$_[0]") or die "No such file\n";
                      @myscript2=<PLTFILE2>;
                      close PLTFILE2;

                      # Test-routine for the array... counts the array's values
                      #$counter=@myscript;
                      #print $counter;

                      # Test-print one array-value on the screen
                      #print @myscript[84732];
                      }

                      Comment


                      • #12
                        Siehe Beitrag 2
                        Christian

                        Comment


                        • #13
                          hallo,

                          habe es nun nach einigen tagen einigermaßen hinbekommen. nur der letzte schritt fehlt noch. ich will ein array1 mit einem anderen array2 durchsuchen, d.h. jeder wert von array1 wird in array2 nach treffern durchlaufen... bei einem treffer in array2 wird die gefundene zeile komplett mit der zeile aus array1 ersetzt.

                          mein code dazu sieht folgendermaßen aus. ich probier erstmal nur die gefundene zeile anzuzeigen und noch nicht auszutauschen:

                          foreach my $CFG (@CFG_PLT_CLEAN)
                          {
                          foreach my $A2L (@Reduced_A2L) {
                          if ($CFG=~/($A2L)(_\d+)/)
                          {
                          print $CFG;
                          }}

                          irgendwas klappt da aber nicht genau... bitte sehr um eure hilfe...

                          mfg

                          Comment


                          • #14
                            irgendwas klappt da aber nicht genau...
                            Sollen wir jetzt raten was nicht klappt?

                            Immerhin werden 2 Schleifen gezeigt und eine if-Bedingung mit einem regul. Ausdruck.

                            Da keiner weiss was in einer Zeile vom ersten Array drin ist und mit was das verglichen werden soll, wird dir keiner helfen können.

                            Wahrscheinlich wird es wie in Beitrag 9 sein, dass du den Unterschied zwischen suchen/ersetzen und matchen nicht beachtest, denn sofern es um die oben gezeigten Datensätze handelt, enden die nicht mit einer Zahl

                            Meine Glaskugel ist zum polieren.....
                            Christian

                            Comment


                            • #15
                              da stimm ich zu, die aussage war sehr schwammig ;-)

                              anhand eines einfachen beispieles will ich es aber verdeutlichen:

                              ich habe zwei dateien: eine cfg und eine a2l

                              inhalt der cfg (den ich in ein array lade):

                              brezel_
                              schnitzel_
                              cola_


                              inhalt der a2l (den ich in ein anderes array lade):
                              africola_10
                              wiener_schnitzel_43


                              ich möchte nun einzeln jede zeile der cfg mit jeder zeile der a2l vergleichen, und falls das wort inkl. _ auftaucht, will ich es von der a2l in die cfg schreiben (bestehende zeile wird gelöscht).

                              in diesem beispiel sähe die "neue" cfg folgendermaßen aus:

                              brezel_
                              wiener_schnitzel_43
                              africola_10


                              hat da bitte jemand nen code dazu?

                              mein versuch sah so aus


                              foreach my $CFG (@CFG_PLT_CLEAN)
                              {
                              foreach my $A2L (@Reduced_A2L) {

                              print ($CFG."\n");
                              print ($A2L."\n");

                              if ($CFG=~/($A2L)(_\d+)/)
                              {
                              # print $CFG;
                              }
                              }



                              und hat nicht funktioniert... ich vermute, dass es an den regular expressions liegt... wie muss ich die in diesem fall formulieren und wie kann ich die zeile ersetzen?

                              hoffe, das war jetzt etwas deutlicher... probier mit dem code schon seit paar tagen rum...

                              Comment

                              Working...
                              X