Pampel: Suchen und Ersetzen

Hallo zusammen,

die Eintragungen in einem HTML-Formular sollen in eine csv-Datei geschrieben werden. Bis auf zwei kleine Schönheitsfehler klappt das auch.

Bei Eintragungen in einem <textarea>-Feld werden von den Nutzern des Formulars oft mehrere Zeilen (auch Leerzeilen) geschrieben. Diese Eintragungen möchte ich in der csv-Datei aber in *einer* Zeile stehen haben. Dazu wollte ich folgenden verwenden:

$wert = $Form{$field};
  $wert =~ s/\n/ /gim;
  print CSVFILE "$wert;";

Ich wollte also einen Zeilenumbruch durch ein Leerzeichen ersetzen. Aber leider stehen immer noch die Inhalte der <textarea>-Felder in mehreren Zielen in der csv-Datei.

Außerdem hätte ich gerne, dass Felder, in denen nix steht, ein ";" geschrieben wird, weil die csv-Datei in Excel ausgewertet werden soll. Sind in einem Feld keine Eintragungen gemacht worden, so sind die Werte in den Spalten entsprechend den ausgelassenen Feldern nach links verschoben und müssen in Excel von Hand wieder an die richtige Stelle geschoben werden.

Die Konstruktion

if ($wert == "") {
  print CSVFILE ";";
}

schreibt hinter *jedes* Feld ein zusätzliches Leerzeichen
feld1;;feld2;;feld3;;

und nicht, wie ich es wollte
feld1;;feld3;

wenn z.B. feld 2 nicht ausgefüllt wurde.

Danke für Hinweise zu den beiden Problemen.

Pampel

  1. Bei Eintragungen in einem <textarea>-Feld werden von den Nutzern des Formulars oft mehrere Zeilen (auch Leerzeilen) geschrieben. Diese Eintragungen möchte ich in der csv-Datei aber in *einer* Zeile stehen haben. Dazu wollte ich folgenden verwenden:

    $wert = $Form{$field};
      $wert =~ s/\n/ /gim;
      print CSVFILE "$wert;";

    Nach deiner Problembeschreibung zu Urteilen, verwendest du weder Warnings noch use strict, außerdem nicht das Modul CGI. Damit hast du dir eine Menge Hilfen verbaut.

    Wenn dein Programm strict ist und alle Warnungen (siehe Error Log) weg sind, solltest du der Lösung deines Problems näher sein.

    Struppi.

    1. Hallo,

      Nach deiner Problembeschreibung zu Urteilen, verwendest du weder Warnings noch use strict, außerdem nicht das Modul CGI. Damit hast du dir eine Menge Hilfen verbaut.

      Sorry, bin relativer Anfänger und nicht dauernd am CGI-programmieren.
      Daher sind mir die Begriffe "warnings" und "use stricct" nicht bekannt, konnte damit aber auch nicht mein Problem (noch nicht) lösen.

      ... alle Warnungen (siehe Error Log) weg sind ..

      Es gibt keine Warnungen, das Programm (siehe Eingangsposting) läuft und macht, was es machen soll. Lediglich die beiden Punkte, die ich angesprochen habe, bekommen ich trotz einigen Ausprobierens halt nicht hin.

      Stimmt denn die Syntax oder stimmt sie nicht? Mit der Beantwortung dieser Frage wäre mir schon sehr geholfen.

      Oder kann man das anders/besser machen? Ich hab', wie gesagt, einiges ausprobiert, hab's aber nicht hinbekommen.

      Danke.

      Pampel

      1. Nach deiner Problembeschreibung zu Urteilen, verwendest du weder Warnings noch use strict, außerdem nicht das Modul CGI. Damit hast du dir eine Menge Hilfen verbaut.
        Sorry, bin relativer Anfänger und nicht dauernd am CGI-programmieren.
        Daher sind mir die Begriffe "warnings" und "use stricct" nicht bekannt, konnte damit aber auch nicht mein Problem (noch nicht) lösen.

        Dein Programm sollte so beginnen:

        #!/usr/bin/perl -w

        use strict;

        Und sicher kannst du damit dein Problem lösen, denn soweit ich das sehe ist dein Code nicht unbedingt falsch, aber das muss nichts heißen, da du dank dem weglassen des obigen keine Tippfehler mehr findest.

        ... alle Warnungen (siehe Error Log) weg sind ..
        Es gibt keine Warnungen, das Programm (siehe Eingangsposting) läuft und macht, was es machen soll. Lediglich die beiden Punkte, die ich angesprochen habe, bekommen ich trotz einigen Ausprobierens halt nicht hin.

        Du hast die Warnungen ja auch nicht eingeschaltet.

        Stimmt denn die Syntax oder stimmt sie nicht? Mit der Beantwortung dieser Frage wäre mir schon sehr geholfen.

        JA, sonst würde das Programm nicht starten.

        Oder kann man das anders/besser machen? Ich hab', wie gesagt, einiges ausprobiert, hab's aber nicht hinbekommen.

        verwende use strict und die Warnungen. Dann kann man weitersehen. So kann alles mögliche an dem Programm falsch sein.

        Struppi.

        1. Hey,

          #!/usr/bin/perl -w

          das alleine bringt nix bzw. das Programm läuft durch, die von mir gewünschten Effekte zeigen sich aber nicht.

          use strict;

          CGI-Fehler, Programm wird nicht abgearbeitet.

          error-log:
          Global symbol "$missing_field"      requires explicit package name at /home/xxx/cgi-bin/abc.cgi line 808.
          Global symbol "$missing_field_list" requires explicit package name at /home/xxx/cgi-bin/abc.cgi line 811.
          Execution of /home/xxx/cgi-bin/abc.cgi aborted due to compilation errors.
          [Wed Apr  7 14:52:41 2004] [error] [client 11.111.111.111] Premature end of script headers: /home/xxx/cgi-bin/abc.cgi
          Was bedeutet das?

          Einen kleinen Fehler habe ich im Error-Log noch entdeckt:
            ...
            if ($wert eq "") { <---  muss "eq" statt "==" sein, oder?
              print CSVFILE ";";
            }
            ...

          Das Ergebnis ist aber immer noch nicht das, was ich haben möchte.

          Pampel

          1. Hallo Pampel

            Hey,

            #!/usr/bin/perl -w
            das alleine bringt nix bzw. das Programm läuft durch, die von mir gewünschten Effekte zeigen sich aber nicht.

            Die Warnungen hast aber gefunden?

            use strict;
            CGI-Fehler, Programm wird nicht abgearbeitet.

            klar, weil du jetzt alle Variabeln explizit mit my deklarieren musst. Das bedeutet, wenn du dich vertippt haben solltest läuft das Programm auch nicht mehr.

            Das erscheint jetzt nach unnötiger Mehrarbeit, aber wie gesagt dein code sieht nicht so falsch aus und evtl. ist es ein Tippfehler. Aber solange du nciht mit use strict arbeitest kann dir das keiner beantwortete und so bleibt alle nur ein Ratespiel.

            Einen kleinen Fehler habe ich im Error-Log noch entdeckt:
              ...
              if ($wert eq "") { <---  muss "eq" statt "==" sein, oder?
                print CSVFILE ";";
              }
              ...

            das ist schon mal was, aber so wie ich das Skript sehe ist diese Zeile sowieso überflüssig, da du mit
            print CSVFILE "$wert;";

            ja auch bei einem leeren Wert einen Datensatz erzeugst. Problematisch ist eher, das du nicht prüfst ob der Wert überhaupt definiert ist.

            und nebenbei:
            $wert =~ s/\n/ /gim;

            es reicht 'g'
            $wert =~ s/\n/ /g;

            da bei Zeilenumbrüchen Gross und kleinschreibung egal sein sollte. was m macht weiss ich nicht.

            Struppi.

            1. Hallo Struppi,

              $wert =~ s/\n/ /gim;
              [...]
              was m macht weiss ich nicht.

              das m verändert das Verhalten von ^ und $ so, dass sich auch bei Newlines greifen (siehe auch http://de.php.net/pcre.pattern.modifiers).

              Grüße aus Nürnberg
              Tobias

              --
              Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            2. Hey,

              Die Warnungen hast aber gefunden?

              ähämm... wo find ich die? Im error-log? dann ja.

              klar, weil du jetzt alle Variabeln explizit mit my deklarieren musst.

              OK. Das könnte ich noch machen.

              Das erscheint jetzt nach unnötiger Mehrarbeit,

              .. wenn's hilft :-)

              aber wie gesagt dein code sieht nicht so falsch aus und evtl. ist es ein Tippfehler.

              Es handelt sich um das (ich trau' mich ja kaum, es zu sagen) das Formmail-Script von Matt Wright. Es gibt bei einem meiner Kunden das Problem, dass er Anrufe von Leuten, die bei ihm reservieren möchten, bekommt, die ihn fragen, wo die Bestätigungen bleiben. Oft ist es dann so, dass er deren Mails nicht bekommen hat.

              Um zu überprüfen, woran das liegen kann, will ich alle Eintragungen im Formular in die csv-Datei schreiben. Vielleicht kann man's ja so rausfinden.

              In den Textfeldern können aber mehrere Zeilen stehen: die will ich raushaben, so dass der Inhalt nur in einer Zeile steht.

              Ebenso kann z.B. die Faxnummer nicht angegeben sein: hier möchte ich das ";" für ein leeres Feld haben, damit ich ich Excel weiterarbeiten kann.

              Das eigentliche Script von Matt Wright (V 1.92) ist soweit OK, die Implementierung der Protokollierungsfunktion klappt eigentlich auch - bis eben auf die beiden "kleinen" Sachen.

              Kurz. Ein Tippfehler "irgendwoanders" als an den relevanten Stellen ist meiner Meinung nach wohl nicht das Problem, eher die richtige Sytax für die angestrebte Lösung.

              Danke für Deine Mühen,

              Pampel

              1. use Mosche;

                Es handelt sich um das (ich trau' mich ja kaum, es zu sagen) das Formmail-Script von Matt Wright.

                Erspare dir (und uns) einige Mühen, wenn du gleich umsteigst:
                http://nms-cgi.sourceforge.net/

                use Tschoe qw(Matti);

                --
                  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
              2. Die Warnungen hast aber gefunden?
                ähämm... wo find ich die? Im error-log? dann ja.

                Ja.

                klar, weil du jetzt alle Variabeln explizit mit my deklarieren musst.
                OK. Das könnte ich noch machen.

                Das erscheint jetzt nach unnötiger Mehrarbeit,
                .. wenn's hilft :-)

                genau ;-)

                In den Textfeldern können aber mehrere Zeilen stehen: die will ich raushaben, so dass der Inhalt nur in einer Zeile steht.

                Ebenso kann z.B. die Faxnummer nicht angegeben sein: hier möchte ich das ";" für ein leeres Feld haben, damit ich ich Excel weiterarbeiten kann.

                Also, soweit ich das seh sollte es so gehen wie du es vorhast.
                Die Zeilen:
                 $wert = $Form{$field};
                  $wert =~ s/\n/ /gim;
                  print CSVFILE "$wert;";

                sind nicht ganz so falsch, besser so:

                my $wert = $Form{$field};
                $wert = '' unless defined $wert
                $wert =~ s/\n/ /g;
                print CSVFILE "$wert;";

                das sollte auch das Kriterium mit den leeren Feldern erfüllen. Wenn nicht ist irgendwo anders was faul.

                Kurz. Ein Tippfehler "irgendwoanders" als an den relevanten Stellen ist meiner Meinung nach wohl nicht das Problem, eher die richtige Sytax für die angestrebte Lösung.

                in deinem Falle ist es evtl. eher ein Problem mit undefinierten Variabeln. Im Prinzip sollte man immer überprüfen ob man einen Wert hat oder einen der dem entspricht was man erwartet.
                Das $wert = '' unless defined $wert macht genau das, da du einen String willst bzw. brauchst, bekommst du, falls das Feld nicht ausgefüllt wurde, einen Leerstring.

                Struppi.

  2. Hallo,

    der Artikel http://aktuell.de.selfhtml.org/artikel/cgiperl/zeilenumbruch/index.htm könnte Dir helfen Dein Problem zu lösen.

    Gruß Helmut