Vollpfosten: .csv datei durchsuchen

Hallo,
ist es möglich mittels php eine csv datei durchsuchbar zu machen und nach werten zu suchen sprich, ich gebe eine PLZ an und erhalte dann den dazugehörigen wert bzw. den wert in der nähe der plz?

  1. Hallo,

    ist es möglich mittels php eine csv datei durchsuchbar zu machen und nach werten zu suchen sprich, ich gebe eine PLZ an und erhalte dann den dazugehörigen wert bzw. den wert in der nähe der plz?

    Mit der Funktion fgetcsv kann man eine CSV-Datei ganz bequem parsen, siehe http://www.php.net/manual/en/function.fgetcsv.php - da ist auch ein nettes Beispiel wie das geht dabei.

    Grüße,

    Christian

    1. Hallo,

      ist es möglich mittels php eine csv datei durchsuchbar zu machen und nach werten zu suchen sprich, ich gebe eine PLZ an und erhalte dann den dazugehörigen wert bzw. den wert in der nähe der plz?
      Mit der Funktion fgetcsv kann man eine CSV-Datei ganz bequem parsen, siehe http://www.php.net/manual/en/function.fgetcsv.php - da ist auch ein nettes Beispiel wie das geht dabei.

      Grüße,

      Christian

      Hallo,
      vielen Dank für die prompte antwort.
      Aber wie kann ich z.B. eine PLZ eingeben und dann die PLZ oder alle im Umkreis bekommen?
      Ich bin Anfänger wie ihr merkt.

      1. Hallo,

        Aber wie kann ich z.B. eine PLZ eingeben und dann die PLZ oder alle im Umkreis bekommen?
        Ich bin Anfänger wie ihr merkt.

        Jeder war mal Anfänger, das macht nichts. In PHP bekommt man ja alle Formulardaten als Variablen. Wenn man also ein Formular hat, das so ähnlich wie folgendes aussieht:

        ----- schnipp -----
        <form action="suche.php" method="post">
        PLZ: <input type="text" name="plz" value="" maxlength="5" size="5" /><br />
        <input type="submit" name="submit_button" value="Suchen" />
        </form>
        ----- schnapp ------

        dann bekommt man in der PHP-Datei suche.php die Variable $plz (bzw. $_POST["plz"], falls register_globals auf off gestellt ist). Diese enthält dann die Postleitzahl, die der Benutzer eingegeben hat. Die Funktion fgetcsv durchsucht die Datei ja Zeile für Zeile. Du öffnest deine CSV-Datei also wie im Beispiel der Funktionsbeschreibung. Dann arbeitest Du die Datei mit fgetcsv Zeile für Zeile ab. Du weißt sicherlich, in welche Spalte die PLZ steht. Ich habe jetzt den Beispiel-Code so modifiziert, dass die PLZ in der Spalte 0 (also der ersten Spalte, das Zählen fängt bei 0 an) und die gesuchte Information zu der Postleitzahl in den Spalten 1, 2 und 3 steht. Der Folgende Code ist der Beispielcode der Funktionsbeschreibung leicht modifiziert (eine Quick-und-Dirty-Lösung):

        ----- schnipp ------
        $row = 1;
        $fp = fopen ("test.csv","r");
        while ($data = fgetcsv ($fp, 1000, ",")) {
            if ($data[0] == $plz) {  // bzw. $_POST["plz"]
              echo "Gefunden in Zeile " . $row . ": ";
              echo "Spalte 2: " . $data[1] . " -- ";
              echo "Spalte 3: " . $data[2] . " -- ";
              echo "Spalte 4: " . $data[3] . "<br />";
            }
            $row++;
        }
        fclose ($fp);
        ----- schnapp ------

        Du musst natürlich den Code noch anpassen.

        Wenn Du Postleitzahlen im Umkreis mitsuchen willst, musst du nach ähnlichen Postleitzahlen suchen, schau' dich dazu einfach mal bei
        http://www.php.net/manual/en/ref.strings.php bzw. http://www.php.net/manual/en/ref.regex.php um.

        Grüße,

        Christian

        P.S.: (OT an alle) ist jetzt nach TOFU TUFO neuerdings Mode?

        1. Hallo,

          Aber wie kann ich z.B. eine PLZ eingeben und dann die PLZ oder alle im Umkreis bekommen?
          Ich bin Anfänger wie ihr merkt.
          Jeder war mal Anfänger, das macht nichts. In PHP bekommt man ja alle Formulardaten als Variablen. Wenn man also ein Formular hat, das so ähnlich wie folgendes aussieht:

          ----- schnipp -----
          <form action="suche.php" method="post">
          PLZ: <input type="text" name="plz" value="" maxlength="5" size="5" /><br />
          <input type="submit" name="submit_button" value="Suchen" />
          </form>
          ----- schnapp ------

          dann bekommt man in der PHP-Datei suche.php die Variable $plz (bzw. $_POST["plz"], falls register_globals auf off gestellt ist). Diese enthält dann die Postleitzahl, die der Benutzer eingegeben hat. Die Funktion fgetcsv durchsucht die Datei ja Zeile für Zeile. Du öffnest deine CSV-Datei also wie im Beispiel der Funktionsbeschreibung. Dann arbeitest Du die Datei mit fgetcsv Zeile für Zeile ab. Du weißt sicherlich, in welche Spalte die PLZ steht. Ich habe jetzt den Beispiel-Code so modifiziert, dass die PLZ in der Spalte 0 (also der ersten Spalte, das Zählen fängt bei 0 an) und die gesuchte Information zu der Postleitzahl in den Spalten 1, 2 und 3 steht. Der Folgende Code ist der Beispielcode der Funktionsbeschreibung leicht modifiziert (eine Quick-und-Dirty-Lösung):

          ----- schnipp ------
          $row = 1;
          $fp = fopen ("test.csv","r");
          while ($data = fgetcsv ($fp, 1000, ",")) {
              if ($data[0] == $plz) {  // bzw. $_POST["plz"]
                echo "Gefunden in Zeile " . $row . ": ";
                echo "Spalte 2: " . $data[1] . " -- ";
                echo "Spalte 3: " . $data[2] . " -- ";
                echo "Spalte 4: " . $data[3] . "<br />";
              }
              $row++;
          }
          fclose ($fp);
          ----- schnapp ------

          Du musst natürlich den Code noch anpassen.

          Wenn Du Postleitzahlen im Umkreis mitsuchen willst, musst du nach ähnlichen Postleitzahlen suchen, schau' dich dazu einfach mal bei
          http://www.php.net/manual/en/ref.strings.php bzw. http://www.php.net/manual/en/ref.regex.php um.

          Grüße,

          Christian

          P.S.: (OT an alle) ist jetzt nach TOFU TUFO neuerdings Mode?

          kriege bei suche.php folgende fehlermeldung

          Parse error: parse error in /homepages/24/d50790997/htdocs/coop/suche.php on line 5

          da steht
          $row = 1;

          der text lautet insgesamt:
          <html><head><title>Test</title>
          </head>
          <body>
          <? php
          $row = 1;
          $fp = fopen ("filialen.csv","r");
          while ($data = fgetcsv ($fp, 1000, ",")) {
              if ($data[3] == $PLZ) {  // bzw. $_POST["PLZ"]
                echo "Gefunden in Zeile " . $row . ": ";
                echo "Spalte 1: " . $data[1] . " -- ";
                echo "Spalte 2: " . $data[2] . " -- ";
                echo "Spalte 3: " . $data[3] . "<br />";
              }
              $row++;
          }
          fclose ($fp);

          </body>
          </html>

          1. Hallo,

            da steht
            $row = 1;

            der text lautet insgesamt:
            [...]

            Es geht bei den meisten Parse-Errors nicht darum, was in der Zeile steht, sondern was davor steht. Du hast <? php (mit Leerzeichen) geschrieben und nicht <?php (ohne Leerzeichen).

            Grüße,

            Christian

            1. Hallo,

              da steht
              $row = 1;

              der text lautet insgesamt:
              [...]

              Es geht bei den meisten Parse-Errors nicht darum, was in der Zeile steht, sondern was davor steht. Du hast <? php (mit Leerzeichen) geschrieben und nicht <?php (ohne Leerzeichen).

              Grüße,

              Christian

              Schaue bitte mal unter www.vizacon.de/coop/php.html nach und gib mal ne postleitzahl ein, wieso bekomme ich dann keinen wert angezeigt.
              eine weitere bedingung des kunden:
              Anforderungsspezifizierung:
              Pro Vertriebsschiene (die ja alle einen eigenen Auftritt haben sollen) soll die Vertriebsschiene voreingestellt sein (d.h. Sky-Kunden sehen nur Sky-Filialen, Plaza... usw.)
              "In der Nähe liegende Filialen" können nach den ersten beiden PLZ-Ziffern (falls nicht vorhanden, der nächsthöheren 1. PLZ-Ziffer) bestimmt werden (oder haben Sie andere Vorschläge?).

              1. Hallo,

                Schaue bitte mal unter www.vizacon.de/coop/php.html nach und gib mal ne postleitzahl ein, wieso bekomme ich dann keinen wert angezeigt.
                eine weitere bedingung des kunden:
                Anforderungsspezifizierung:
                Pro Vertriebsschiene (die ja alle einen eigenen Auftritt haben sollen) soll die Vertriebsschiene voreingestellt sein (d.h. Sky-Kunden sehen nur Sky-Filialen, Plaza... usw.)
                "In der Nähe liegende Filialen" können nach den ersten beiden PLZ-Ziffern (falls nicht vorhanden, der nächsthöheren 1. PLZ-Ziffer) bestimmt werden (oder haben Sie andere Vorschläge?).

                1. In PHP sind variablen Case-Sensitive - deswegen muss da statt $PLZ $plz stehen (ausserdem ist bei einigen PHP-Versionen register_globals auf OFF, was an sich sicherer ist, dann muesste es $_POST["plz"] heissen).

                2. Dazu muesste die if-Anweisung erweitert werden (statt if($data[0] == $plz) if($data[0] == $plz && $data[1] == $v_schiene) - wobei im Formular noch ein Feld fuer die v_schiene sein muesste).

                3. Fuer in der Naehe liegenden Filialen wuerde ich auch die ersten beiden Zifern nehmen, wuerde dann mit substr nur die ersten beiden Zeichen vergleichen, siehe http://www.php.net/manual/en/function.substr.php)

                4. Der Code, den ich hier gepostet habe, ist nur Beispielcode; ich wuerde auf jeden Fall die Eingabe noch validieren, d.h. sicherstellen, das der uebergebene Wert wirklich eine 5stellige Nummer ist.

                Gruesse,

                Christian

                1. Hallo,

                  Schaue bitte mal unter www.vizacon.de/coop/php.html nach und gib mal ne postleitzahl ein, wieso bekomme ich dann keinen wert angezeigt.
                  eine weitere bedingung des kunden:
                  Anforderungsspezifizierung:
                  Pro Vertriebsschiene (die ja alle einen eigenen Auftritt haben sollen) soll die Vertriebsschiene voreingestellt sein (d.h. Sky-Kunden sehen nur Sky-Filialen, Plaza... usw.)
                  "In der Nähe liegende Filialen" können nach den ersten beiden PLZ-Ziffern (falls nicht vorhanden, der nächsthöheren 1. PLZ-Ziffer) bestimmt werden (oder haben Sie andere Vorschläge?).

                  1. In PHP sind variablen Case-Sensitive - deswegen muss da statt $PLZ $plz stehen (ausserdem ist bei einigen PHP-Versionen register_globals auf OFF, was an sich sicherer ist, dann muesste es $_POST["plz"] heissen).
                  1. Dazu muesste die if-Anweisung erweitert werden (statt if($data[0] == $plz) if($data[0] == $plz && $data[1] == $v_schiene) - wobei im Formular noch ein Feld fuer die v_schiene sein muesste).
                  1. Fuer in der Naehe liegenden Filialen wuerde ich auch die ersten beiden Zifern nehmen, wuerde dann mit substr nur die ersten beiden Zeichen vergleichen, siehe http://www.php.net/manual/en/function.substr.php)
                  1. Der Code, den ich hier gepostet habe, ist nur Beispielcode; ich wuerde auf jeden Fall die Eingabe noch validieren, d.h. sicherstellen, das der uebergebene Wert wirklich eine 5stellige Nummer ist.

                  Gruesse,

                  Christian

                  Hallo,
                  vielen Dank, ich werde es versuchen.
                  In dem Formular soll keine Vertriebslinie auftauchen oder wählbar sein, da man auf der Seite der jeweiligen Vertriebslinie nur nach den Filialen der jewieligen Vertriebsschiene und nicht nach den anderne Vertriebslinien suchen soll.
                  Da die PLZ in Spalte 3 stehen muss es doch so heißen, oder
                  if ($data[3] == $plz) {  // bzw. $_POST["plz"]
                  Gruß

                  Marco Lücke

                  1. Hallo,

                    Schaue bitte mal unter www.vizacon.de/coop/php.html nach und gib mal ne postleitzahl ein, wieso bekomme ich dann keinen wert angezeigt.
                    eine weitere bedingung des kunden:
                    Anforderungsspezifizierung:
                    Pro Vertriebsschiene (die ja alle einen eigenen Auftritt haben sollen) soll die Vertriebsschiene voreingestellt sein (d.h. Sky-Kunden sehen nur Sky-Filialen, Plaza... usw.)
                    "In der Nähe liegende Filialen" können nach den ersten beiden PLZ-Ziffern (falls nicht vorhanden, der nächsthöheren 1. PLZ-Ziffer) bestimmt werden (oder haben Sie andere Vorschläge?).

                    1. In PHP sind variablen Case-Sensitive - deswegen muss da statt $PLZ $plz stehen (ausserdem ist bei einigen PHP-Versionen register_globals auf OFF, was an sich sicherer ist, dann muesste es $_POST["plz"] heissen).
                    1. Dazu muesste die if-Anweisung erweitert werden (statt if($data[0] == $plz) if($data[0] == $plz && $data[1] == $v_schiene) - wobei im Formular noch ein Feld fuer die v_schiene sein muesste).
                    1. Fuer in der Naehe liegenden Filialen wuerde ich auch die ersten beiden Zifern nehmen, wuerde dann mit substr nur die ersten beiden Zeichen vergleichen, siehe http://www.php.net/manual/en/function.substr.php)
                    1. Der Code, den ich hier gepostet habe, ist nur Beispielcode; ich wuerde auf jeden Fall die Eingabe noch validieren, d.h. sicherstellen, das der uebergebene Wert wirklich eine 5stellige Nummer ist.

                    Gruesse,

                    Christian

                    Hallo,
                    vielen Dank, ich werde es versuchen.
                    In dem Formular soll keine Vertriebslinie auftauchen oder wählbar sein, da man auf der Seite der jeweiligen Vertriebslinie nur nach den Filialen der jewieligen Vertriebsschiene und nicht nach den anderne Vertriebslinien suchen soll.
                    Da die PLZ in Spalte 3 stehen muss es doch so heißen, oder
                    if ($data[3] == $plz) {  // bzw. $_POST["plz"]
                    Gruß

                    Marco Lücke

                    Ich kriege immer noch keinen Wert angezeigt.

                    1. Hallo,

                      Da die PLZ in Spalte 3 stehen muss es doch so heißen, oder
                      if ($data[3] == $plz) {  // bzw. $_POST["plz"]

                      Wenn Sie in  Spalte 3 stehen, dann ist es $data[2], da das Zählen mit 0 anfängt!

                      Ich kriege immer noch keinen Wert angezeigt.

                      Vielleicht wird die CSV-Datei nicht durch Kommas, sondern durch Semikolon getrennt. Könnte ich mal eine Beispielzeile der CSV-Datei sehen?

                      Grüße,
                      Christian

                      1. Hallo,

                        Da die PLZ in Spalte 3 stehen muss es doch so heißen, oder
                        if ($data[3] == $plz) {  // bzw. $_POST["plz"]

                        Wenn Sie in  Spalte 3 stehen, dann ist es $data[2], da das Zählen mit 0 anfängt!

                        Ich kriege immer noch keinen Wert angezeigt.

                        Vielleicht wird die CSV-Datei nicht durch Kommas, sondern durch Semikolon getrennt. Könnte ich mal eine Beispielzeile der CSV-Datei sehen?

                        Grüße,
                        Christian

                        Natrülich,
                        hier die ersten beiden Zeilen:
                        "Vertriebsl;Nr;PLZ;OrtStrasse;Marktleiter;Fleischabtltr;Telefon;Telefax;Email";
                        "Bau- und Gartencenter;270;17419;Ahlbeck";" Swinemünder Str.

                        jetzt kriege ich das angezeigt:
                        Gefunden in Zeile 1: Spalte 1: -- Spalte 2: -- Spalte 3:
                        wie kriege ich das denn hin, das er einen wert anzeigt