14. Lectura de fitxers línia a línia
Índex
Introducció
El PHP permet desar dades estructurades en fitxers de text; posteriorment aquestes dades són recuperades i aprofitades amb finalitats diverses. La lectura de les dades es fa línia a línia; l'escriptura es pot fer línia a línia, per la càrrega de tot el fitxer en bloc, o pot formar part del web amb caràcter fix.
Les actuacions línia a línia sobre un fitxer sempre comporten tres operacions:
- Obrir el fitxer amb la funció fopen().
- Fer l'actuació corresponent de lectura, amb fgets(), o d'escriptura, amb fputs().
- Tancar el fitxer amb la funció fclose().
La funció fopen() fa servir dos arguments: en el primer s'indica l'arxiu sobre el qual s'actua, i en el segon s'indica el mode. Hi ha tres modes, "r" (lectura), "w" (escriptura) i "a" (escriptura afegida al contingut anterior).
La funció fopen() s'usa així:
- $ctrl = fopen("$nom_de_l'arxiu","mode")
L'identificador $ctrl (de nom arbitrari) és una variable que es fa servir com referència en la resta del programa fins al moment de tancar-lo. Podem concebre-la com el nom del fitxer un cop obert.
Estructura per a la lectura de documents línia a línia
Un cop obert el fitxer en mode r, la lectura es fa amb la funció fgets(), que s'aplica tantes vegades com línies tingui el fitxer:
- $ctrl=fopen("nom.txt","r");
- $lectura = fgets($ctrl);
- ... instruccions sobre què fer amb les dades $lectura ...
- ... repetir l'estructura anterior tantes vegades com calgui ...
- fclose($ctrl);
Es pot afegir un segon argument a fgets() que indiqui la mida màxima de cada lectura:
- $lectura = fgets($ctrl, 100)
fa que els fragments llegits tinguin com a màxim 99 bytes.
- Saturn
- 14a.jpg
- 60.268 km.
- 95.152 Terres
- 29,46 anys
- <?php
- $ctrl = fopen("14a.txt", "r"); // Obrim el fitxer
- $linia_1 = fgets($ctrl, 4096); // Inici de la lectura i aprofitament
- echo "<h2 style='font-size: 30px; text-decoration: underline; text-align: center; color: blue'>" . $linia_1 . "</h2>";
- echo "<p> </p>";
- $linia_2 = fgets($ctrl, 4096);
- echo "<p><img src='" . $linia_2 . "' alt='foto' style='float: right' />";
- $linia_3 = fgets($ctrl, 4096);
- echo "Radi equatorial: " . $linia_3 . "<br />";
- $linia_4 = fgets($ctrl, 4096);
- echo "Massa: equivalent a " . $linia_4 . "<br />";
- $linia_5 = fgets($ctrl, 4096);
- echo "Període orbital: " . $linia_5 . "</p>"; // Final de la lectura i aprofitament
- fclose($ctrl); // Tanquem el fitxer
- ?>
Vegeu-ne el resultat
Fer una lectura d'un fitxer coneixent-ne el nombre de línies és, en realitat, de molt poca utilitat. En el cas més general no coneixem el nombre de línies; aleshores cal establir un programa de lectura en bucle, combinant while(), que controla l'execució reiterada, amb la funció feof(), que detecta el final del fitxer:
- $ctrl=fopen("nom.txt","r");
- while(!feof($ctrl)){
- $lectura = fgets($ctrl);
- ... instruccions sobre què fer amb les dades $lectura ...
- }
- fclose($ctrl);
- Document inicial, sense codi PHP, dotat de dos enllaços, cada un dels quals aporta un valor diferent de GET
- Quina petita pàtria
- encercla el cementiri!
- Aquesta mar, Sinera,
- turons de pins i vinya,
- pols de rials. No estimo
- res més, excepte l'ombra
- viatgera d'un núvol
- i el lent record dels dies
- que són passats per sempre.
- Vinyes verdes vora el mar,
- ara que el vent no remuga,
- us feu més verdes i encar
- teniu la fulla poruga,
- vinyes verdes vora el mar.
- <?php
-
- $autor = $_GET['a']; // Rep la dada de la tria
- if ($autor == "esp") { $ctrl = fopen("14c.txt", "r"); } // Una opció obre un fitxer
- if ($autor == "sag") { $ctrl = fopen("14d.txt", "r"); } // L'altra opció obre l'altre
- while (!feof($ctrl)) { // Bucle amb control del final
- $linia = fgets($ctrl, 4096); // Lectura de cada línia
- echo $linia . "<br />"; // Presentació de la línia
- }
- fclose($ctrl); // Tanca el fitxer obert
-
- ?>
Vegeu-ne el resultat
Aplicació a petites bases de dades
Cada una de les línies del fitxer de text pot ésser estructurada en diverses seccions, mitjançant un caràcter - o seqüència de caràcters - de separació. D'aquesta manera el fitxer pot equivaldre a una taula de dades: cada línia és un registre i cada secció un camp.
- 3 ¬ Li ¬ Liti ¬ 3 ¬ 6,94
- 6 ¬ Na ¬ Sodi ¬ 11 ¬ 22,997
- 4 ¬ K ¬ Potassi ¬ 19 ¬ 39,096
- 5 ¬ Rb ¬ Rubidi ¬ 37 ¬ 85,48
- 1 ¬ Cs ¬ Cesi ¬ 55 ¬ 132,91
- 2 ¬ Fr ¬ Franci ¬ 87 ¬ (223)
- <?php
- $ctrl = fopen("14g.txt", "r"); // Obre el fitxer
- while (!feof($ctrl)) { // Bucle amb control de final de fitxer
- $linia = fgets($ctrl, 4096); // Lectura línia a línia
- list($n,$a,$b,$c,$d) = split(' ¬ ',$linia); // Fragmentació de les línies (registres) en camps
- echo '<tr>'; // Inici de la fila corresponent a un registre
- echo '<td class="e">' . $a . '</td>';
- echo '<td class="e">' . $b . '</td>';
- echo '<td class="e">' . $c . '</td>';
- echo '<td class="e">' . $d . '</td>';
- echo '</tr>'; // Final de la fila corresponent a un registre
- }
- fclose($ctrl); // Tanca el fitxer
- ?>
Vegeu-ne el resultat
Si, mitjançant un formulari o un altre recurs, introduïm en el programa un valor $valor d'un camp, podem seleccionar només els registres que ccompleixen un determinat requisit
- if ($camp_llegit == $valor){
- instruccions
- }
Són possibles moltes combinacions:
- Presentar tots els camps dels registres seleccionats.
- Presentar el valor d'un camp de tots els registres, i a partir d'aquest valor seleccionar un o més registres, dels quals, en una segona fase, es presentaran tots els camps o una part d'aquests.
- Fer servir els valors d'un camp del registre seleccionat com criteri de selecció en una segona taula (bases de dades relacionals).
- ...
Cal advertir però que aquest mètode resulta molt poc eficient, i només s'hauria de fer servir en bases de dades molt petites. Per a les bases de dades grans es fa servir el MySQL.