Kleine PHP-Überraschungen für Anfänger

Silke Schümann wrote this 12:21:

Ich habe eine Datei mit Katalogdaten und am Anfang einige Kommentare, über Autoren, Erläuterungen und Meta-Angaben zu den nachfolgenden Daten.

  1. /**
  2. *
  3. # Blablahblah Erklär erklär erklär
  4. # Blahblahblahblah Autor
  5. # Blahblahblahblah Datenstruktur
  6. # 1=privat, 0=öffentlich|IdexN°|Name|Eigenschaft, Eigenschaft, etc.|Farbe, Farbe, Farbe, etc.|Preis
  7. *
  8. **/
  9.  
  10. 1|2568r|Strapse|Brüssler Spitze,Diamantklipp|Rot|123,00
  11. 1|2568s|Strapse|Brüssler Spitze,Diamantklipp|Schwarz|123,00
  12. 1|2568p|Strapse|Brüssler Spitze,Diamantklipp|Pink|123,00
  13. 1|2568c|Strapse|Brüssler Spitze,Diamantklipp|Creme|123,00
  14. 1|2568w|Strapse|Brüssler Spitze,Diamantklipp|Weiß|123,00

Und ich habe das folgende Skript, um zu sehen was passiert … ob denn passiert, was ich erwarte …

  1. <?PHP
  2. error_reporting(E_ALL);
  3. $fhandle = fopen ("katalogtestdata.csv","r");
  4. for ($row = 10; $katdat = fgetcsv ($fhandle, 512, "|"); $row++) {
  5. echo '<pre>';
  6. print_r($katdat);
  7. echo '</pre>';
  8. }
  9. fclose ($fhandle);
  10. ?>

Da die Daten erst in Zeile 10 beginnen, kam ich auf den seltsamen Trichter, dass der Wert $row = 10 den Pointer auch in die Reihe 10 befördert, aber dem ist nicht so. Siehe http://blog.templaterie.de/demo/katalog.php

Ahja. Erkenntnis. Es ist schnurz piep Wurscht ob man das Zählen bei 1 oder bei 9999999999 anfängt. Der Pointer steht am Anfang auf 0 im Array und ich muss wenn ich die Erläuterungen zum File überspringen will, irgendein ftell oder wie auch immer … oder aber die Doku für Faule aus dem Anfang der Datei verbannen und gleich mit den Daten anfangen. PHP lernen ist luschtig! HaHa. Na, ich bin gespannt, wann das Schleifchen um meinen Array wirklich festgezurrt ist und ich keine komischen Überraschungen mehr erlebe.

Lösung zu “Wie überspringe ich in der CSV-Datei Kommentare am Anfang?”

  1. <?PHP
  2. error_reporting(E_ALL);
  3. $fhandle = fopen ("katalogtestdata.csv","r");
  4. for ($row = 0; $katdat = fgetcsv ($fhandle, 512, "|"); $row++) {
  5. if($row>=10){
  6. echo '<pre>';
  7. print_r($katdat);
  8. echo '</pre>';
  9. }
  10. }
  11. fclose ($fhandle);
  12. ?>

So nun hat man am Anfang seinen Cermon mit Erläuterungen und als Gedächtnisstütze, wenn man den Textfile lange nicht mehr anfassen muss und das Programm fängt bei dem ersten Datensatz an. Denn innerhalb der Schreife ist die Variable $row unsere Sprungmarke und unser Steuerungsmodul, nur eben nicht in vor und in der Klammer der for-Schleife.

Provokative Formulierungen haben den Vorteil, dass sie den Ehrgeiz wecken. Der Schwachpunkt meiner kleinen Anfänger-Lösung ist, dass der Kommentar fest ist und sollte jemand eine Kommentarzeile hinzufügen, man den oder die ersten Datensätze verliert. Dass Textfiles praktisch sind und die Fixierung auf Datenbanken aus mehreren Gründen nicht immer angesagt ist, zeigen z.B. die Farbtabellen von Gimp. Diese Textfiles mit der Endung *.gpl sind wie folgt aufgebaut:

  1. GIMP Palette
  2. Name: History
  3. #
  4. # ColorZilla History Palette
  5. # CZEditable
  6. #
  7.   0 105  63 → div#tew
  8. 222 226 233 → html
  9. 219 218 219 → div#tec
  10.   0   9 132 → div#tew
  11. 140  82  49 → div#tew
  12. 213 207   0 → div#tew
  13. etc. …

Der Aufbau der Datei ist recht simpel und immer gleich. Man muss sich also für eigene Web-Projekte in denen man eine Farbpalette benötigt, nicht extra die Mühe machen und diese Farbwerte erneut erfassen. Man kann sogar mit ColorZilla, das ebenfalls z.B. GIMP-Farbtabellen verwendet, für die eigene Projektdokumentation die Werte, wie oben in dem Beispiel (es ist aus der ColorZilla-History das was dort durch den Einsatz von mir hinterlassen wurde) nutzen und in eine Dokumentationstext übernehmen. Man muss dazu aber den Seitenaufbau diesen *.gpl-Dateien auswerten können.

Gefunden dazu habe ich die Funktionen is_[irgendwas], z.B. is_int, und für mein kleines Beispiel war ich der Meinung, wäre das schon die Lösung. Nur das Ergebnis hat mich wieder überrascht.

  1. $fhandle = fopen ("katalogtestdata.csv","r");
  2. for ($row = 0; $katdat = fgetcsv ($fhandle, 512, "|"); $row++) {
  3. if(is_int($katdat[0])){
  4. echo "Reihe ".$row.": ".$pub[$row]."<br />";
  5. }
  6. else {
  7. continue;
  8. }
  9. }
  10. fclose($fhandle);

Das erzeugt eine gähnende Leere. Und ich dachte immer 1 sei eine Ganzzahl. Erfolg brachte if(!is_int($katdat[0])), also wenn der erste Paramenter keine Ganzzahl ist. Ich dachte auch immer ‘#’ sei keine Ganzzahl, komischer Weise ignorierte aber das Skript nun die Zeilen, die mit einer ‘#’ eingeleitet wurden.Ähhömmm! Man sollte schon aufpassen welche Datei gerade im Texteditor offen ist und welche man editiert. Ich fand es dennoch nicht befriedigend, deswegenprobierte ich Mit der Abfrage is_numeric funtkioniert es und siehe da, zumindest für mein Beispiel mit dem Katalog ist das eine befriedigende Lösung. if(is_numeric($katdat[0])) gibt Folgendes aus:
Reihe 5: 1
Reihe 6: 1
Reihe 7: 1
Reihe 8: 1
Reihe 9: 1
Reihe 10: 1

Irritierend finde ich, dass die Reihenummer nicht bei 10, sondern bei Null anfängt. (Das ist weniger irritierend als man denkt, wenn man feststellt, dass im Texteditor … aus welchen Gründen auch immer … nicht der Katalogfile aus der Testumgebung offen ist, sondern jener, der erstellt wurde, um später in der Produktionsumgebung zu stehen und man im CSV-File der Testumgebung immer noch die Daten bei Zeile 0 beginnt … *rotwerd*) Aber ich kaufe alles, solange es funktioniert. Vielleicht findet sich ja noch jemand, der mir und anderen Anfängern erklärt, warum das so ist. Die Anfängerin hat ihren Fehler entdeckt. Tja, … und wie ich die Gimp-Farbtabellen auswerte, wenn am Anfang Leerschritte sind und ob da auch is_numeric funktioniert, das probiere ich ein andermal. Denn heute will ich nur meinen kleinen Katalog so hinbekommen, dass er in Editland in Kompination mit Seitennamen oder Variablen in der Url Listen zu den Templates ausspukt, so dass man diverse hübsche Übersichten erzeugen kann. Und später dann gibt es ein Formular zur Pflege und dann wird es ein Plugin, das man auch kaufen kann. Wer das jetzt schon gerne als Plugin hätte und nicht irgendwann muss laut geben, denn dann gebe ich das kurzerhand an jemanden, der Lust und das Können hat das zu programmieren und via Templaterie als Plugin anbieten möchte.

2 Responses to “Kleine PHP-Überraschungen für Anfänger”

  1. stefan.waidele.info » Blog Archive » Kommentare in CSV-Dateien Says:

    [...] Silke Schümann erwähnte im Templaterie Blog eine interessante Möglichkeit: CSV-Datensammlungen sind sehr viel besser zu wareten, wenn am Anfang der Dateien ein Kommentar steht, der Sinn und Verwendungszweck der Daten sowie das Datenformat erklärt. Dieser Kommentar ist nur für denjenigen gedacht, der diese Dateien von Hand ändert, oder ein Programm schreibt, das auf diese Daten zugreift. Bei der Auswertung der Daten soll der Kommentar ignoriert werden. [...]

  2. Silkester erzählt » Anfänger und Könner in der Interaktion Says:

    [...] Im Templaterie-Blog habe ich angefangen meine ersten PHP-Fortschritte öffentlich zu machen. Diese PHP-Fortschritte sind was sie sind, erste unbeholfene Tapser in der Programmiersprache. Ich habe viele Tutorials gelesen. Lese regelmäßig das PHP-Handbuch und dennoch komme ich mit vielem nicht zurecht und Lösungen werden so manches mal nicht unbedingt die Besten sein. Bislang ist eingetroffen, was ich erhofft hatte und es ist in bester Social-Blogmanier passiert, auch wenn man bei manchen Formulierungen ein wenig mit den Augen rollen darf (in der Hoffnung, dass andere etwas lernen … zu “Kleine Überraschungen für PHP-Anfänger”). [...]

Leave a Reply