CSV Zeile in Formular-Feld importieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • CSV Zeile in Formular-Feld importieren

    Hallo,

    ich habe ein kleines Problem, komme da aber im Moment nicht so ganz weiter.
    Ich habe ein Formular erstellt, wo verschiedene Personendaten eingetragen werden können. Diese Daten werden dann in einer CSV-Liste abgespeichert. Die einzelnen Werte werden mit Semikolon getrennt. Die Liste kann bei Bedarf in HTML oder auch Excel ausgegeben und eingesehen werden.

    Über folgendes kleines Script lese ich eine bestimmte Zeile aus:

    [COLOR=black]
    PHP-Code:

    <?php  $zeilen_zaehler = -1
    $ziel_zeile $_POST["Zeilennummer"]; 
    $datei fopen('daten.csv','r');  

    while ((! 
    feof($datei)) && ($zeilen_zaehler $ziel_zeile)) {  
           if (
    $zeile fgets($datei,1048576)) {     
                 
    $zeilen_zaehler++;   
                 } 
             } 
    fclose($datei); 

    echo 
    "<form name='formular' action='speichern.php' method='post'>"
    echo 
    "<input type='text' size='200' name='aenderung' value='" .$zeile"'>"
    echo 
    "<input style='width:200px' type='submit' action='speichern.php' value='Daten speichern'/>"
    echo 
    "<input type='hidden' size='4' name='Zeilennummer' value='" .$ziel_zeile"'>"
    echo 
    "</form>";
    ?>
    Diese Zeile wird in "ein" Formularfeld eingefügt. Dort können die Daten bearbeitet werden, man muss nur auf die Trennung durch die Semikolons achten, was natürlich absoluter Mist ist. Dann wird die ausgelesen Zeile in der CSV-Liste gelöscht und die neue an die Liste angefügt. Soweit, so gut.

    Meine Frage ist, wie bekomme ich nun die ausgelesene Zeile, mit den im Moment 7 festen Spalten in 7 verschiedene Textfelder, wo sie einzeln bearbeitet werden können!? Dann wäre es für den Bearbeiter etwas übersichtlicher und nicht so unprofessionell.

    Bin mir nicht sicher, ob dies hier der richtige Ansatz ist:

    PHP: str_getcsv - Manual

    Komme damit noch nicht so ganz klar, vielleicht gibt es da mal einen kurzen Tip zur Selbsthilfe!? Würde mich über eine kurze Rückmeldung freuen.

    Vielen Dank!!


    [/COLOR]

  • #2
    Hallo Howard,

    um die einelnen Felder der CSV Datei in je einem input Feld editieren zu können, trenne die Felder ($zeile) einfach mit explode oder mit str_getcsv und baue dann dein Form in einer Schleife auf.

    Bitte bedenke aber, dass sich fgets nicht wirklich für sehr große CSV Dateien eignet, da immer vom Datei Anfang (oder Ende) bis zu deiner Zielzeile gegangen werden muss.
    Eine gute Lösung wäre dann vlcht. die Verwendung einer festen Bytelänge für jede Zeile und die Positionierung des File Pointers mittels fseek.
    Erfordert aber eine Begrenzung der Feldlängen und ggbf. das Auffüllen der Values mit z.B. Whitespaces.

    Desweiteren würde ich bei der Eingabe das Trennzeichen (Semikolon) per Javascript filtern.

    Wenn nur für gültige Zeilen das Form zum speichern gezeigt werden soll,
    prüfe auch, ob wirklich 7 Felder existieren.

    Falls das File Handle ungültig ist, kann es eine Endlosschleife für Werte
    größer der Zeilenanzahl geben (denk dran, der $_POST Variable ist nicht zu trauen!!!).
    Denn feof() gibt bei ungültigem Handle nicht TRUE zurück.
    Daher auch das File Handle auf Gültigkeit prüfen.

    Hier mal ein Vorschlag, wie es aussehen könnte:
    Code:
    $zeilen_zaehler = -1; 
    $ziel_zeile = $_POST["Zeilennummer"]; 
    $datei = fopen('daten.csv','r');  
    while ($datei && (! feof($datei)) && ($zeilen_zaehler < $ziel_zeile)) {  
           if ($zeile = fgets($datei,1048576)) {     
                 $zeilen_zaehler++;   
           } 
    } 
    fclose($datei); 
    
    $valuearray=explode (';',$zeile);
    $Feldname=array("Feldname1","Feldname2","Feldname3","Feldname4","Feldname5","Feldname6","Feldname7");
    
    if(count($valuearray)==7){
      echo "<script type='text/javascript'>";
      echo "function checkValues(th){";
      echo "  var inputs = th.getElementsByTagName('input');";
      echo "  for (key in inputs){";
      echo "    if(inputs[key].value.indexOf(';')!=-1){";
      echo "      alert('Bitte kein Semikolon bei der Eingabe verwenden!');";
      echo "      return false;";
      echo "    }";
      echo "  }";
      echo "  return true;";
      echo "}";
      echo "</script>";
      echo "<form name='formular' action='speichern.php' method='post' onSubmit='return checkValues(this);'>"; 
      foreach($valuearray as $key=>$val){
        echo $Feldname[$key].":<input type='text' size='200' name='aenderung_".$key."' value='" .$val. "'>"; 
      }
      echo "<input style='width:200px' type='submit' action='speichern.php' value='Daten speichern'/>"; 
      echo "<input type='hidden' size='4' name='Zeilennummer' value='" .$ziel_zeile. "'>"; 
      echo "</form>";
    }else{
      echo "Ein Fehler ist aufgetreten...";
    }
    In deiner speichern.php musst Du dann die einzelnen Felder vor dem Einfügen in die CSV Datei natürlich wieder zusammensetzen.

    LG
    Markus

    Kommentar


    • #3
      Guten Morgen,

      vielen Dank für Deine Antwort.

      Ich habe den Ansatz mit dem Explode weiterverfolgt und bin von dem einen Formularfeld weggegangen. Mein Ergebnis ist folgendes:

      PHP-Code:
      <?php

      $zeilen_zaehler 
      = -1;
      $ziel_zeile $_POST["Zeilennummer"];
      $datei fopen('daten.csv','r');

      while ((! 
      feof($datei)) && ($zeilen_zaehler $ziel_zeile)) {
        if (
      $zeile fgets($datei,1048576)) {
          
      $zeilen_zaehler++;
        }
      }
      $array  explode(";",$zeile);
      fclose($datei);

      echo 
      "<span style='Font-Family:Book antiqua; Color:Red;'>Formular</span>";
      echo 
      "<form name='formular' action='speichern.php' method='post'>";
      echo 
      "<table>";
          echo 
      "<tr>";
            echo 
      "<td>Feld1:</td>";
            echo 
      "<td><input name='Feld1' value='" .$array[3]. "'/></td>";
            echo 
      "</td>";
          echo 
      "</tr>";
          echo 
      "<tr>";
            echo 
      "<td>Feld2:</td>";
            echo 
      "<td><input name='Feld2' value='" .$array[2]. "'/></td>";
          echo 
      "</tr>";
          echo 
      "<tr>";
            echo 
      "<td>Feld3:</td>";
            echo 
      "<td><input name='Feld3' value='" .$array[0]. "'/></td>";
          echo 
      "</tr>";
          echo 
      "<tr>";
            echo 
      "<td>Feld4:</td>";
            echo 
      "<td><input maxlength='8' name='Feld4' value='" .$array[1]. "'/></td>";
          echo 
      "</tr>";
          echo 
      "<tr>";
            echo 
      "<td>Feld5:</td>";
            echo 
      "<td><input name='Feld5' value='" .$array[4]. "'/></td>";
          echo 
      "</tr>";
          echo 
      "<tr>";
            echo 
      "<td>Feld6:</td>";
            echo 
      "<td><input name='Feld6' value='" .$array[5]. "'/></td>";
          echo 
      "</tr>";
          echo 
      "<tr>";
            echo 
      "<td>Feld7:</td>";
            echo 
      "<td><input name='Feld7' value='" .$array[6]. "'/></td>";
          echo 
      "</tr>";
        echo 
      "</table><br><br><br><br>";

      echo 
      "<input type='submit' action='speichern.php' value='Daten speichern'/>";
      echo 
      "<input type='hidden' size='4' name='Zeilennummer' value='" .$ziel_zeile"'>";
      echo 
      "</form>";

      ?>
      Von der Optik mal ganz abgesehen, bin ich mit dem Ergebnis eigentlich zufrieden. Was hälst DU davon?
      Das Problem mit dem Semikolon bei der Eingabe ist immer noch und werde ich noch einbauen, da ist das Javascript eine schöne Sache.
      Würde ganz gerne aber ohne hin noch ne Formatierung in den einzelnen Feldern des Formulars vornehmen, falls der Anwender dort etwas fehlerhaftes einträgt, z.B. , dass der jeweils erste Buchstabe immer groß geschrieben wird oder eine gewisse Datumsformatierung.

      Schon mal vielen Dank für Deine Hilfe.

      Howard

      Kommentar


      • #4
        Warum verwendest du nicht fgetcsv()? Das ist doch genau dafür gemacht.

        Kommentar

        Lädt...
        X