Newsgroup: it.comp.www.php
Titolo: Leggere dati da un file di testo

Situazione: mi arriva un file di testo plain ASCII cosi':
Data: <gg_mm_aaaa>
Autore: <cognome_nome>
Titolo: <titolo>
Codice:
<testo_su_piu'_linee>
Fine codice
Quello che vorrei fare e' dare in pasto questo file di testo, che in 
definitiva si presenta con una struttura predefinita, con una sorta di 
header (data, autore, titolo) che precede il contenuto vero e proprio 
(testo) contenuto tra due delimitatori (Codice: e Fine codice), dicevo 
vorrei dare in pasto questo file di testo al PHP per far estrarre i 
valori <gg_mm_aaaa>, <cognome_nome>, <titolo> e <testo_su_piu'_linee> 
per "infilarli" dentro variabili da trattare poi in una normale query, 
allo scopo di immagazzinare tali dati in un database (MySQL). Ovviamente 
è importante che <testo_su_piu'_linee> mantenga la formattazione, con 
tutti gli "a capo" e i rientri (si trattera' di snippet di codice).
Mi suggerite una procedura, un'idea, una traccia per iniziare?
Grazie infinite! :-)
-- 
Falco Stellare - 
falco.ste...@graphicside.it
<< Togli il TAPPO per rispondermi >>

 Mi suggerite una procedura, un'idea, una traccia per iniziare?
http://www.php.net/file_get_contents
http://www.php.net/pcre
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

 
http://www.php.net/pcre
Ottimo, filo subito a studiare!!!
Grazie per lo spunto! :-)


 
http://www.php.net/pcre
Ok, mi ci sto rompendo sopra la testa, pero' non e' immediato maneggiare 
le espressioni regolari... Un aiutino un po' meno laconico? Un brandello 
di codice da smontare e capire...
Ho capito che la procedura logica e':
1) il contenuto del file di testo viene immagazzinato come stringa in 
una variabile tramite la funzione file_get_contents;
2) su questa variabile si interviene con la selezione operata tramite 
regexp per cavare quello che serve.
Grazie per l'aiuto...


 laconico? Un brandello di codice da smontare e capire...
<?php 
// $content = file_get_contents ('file.txt');
$content = 'Data: <gg_mm_aaaa>
Autore: <cognome_nome>
Titolo: <titolo>
Codice:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. 
Donec fermentum urna egestas massa. Praesent lobortis lorem ut est. 
Integer id velit. Nulla facilisi. Suspendisse porta feugiat mauris. 
Pellentesque interdum dolor eget ligula. Nullam enim lorem, tristique
a, aliquet quis, tempor nec, metus. Praesent malesuada aliquet felis.
In ante. Nullam ut quam. Phasellus vel turpis. Nam elementum. 
Fine codice';
$pattern = '/Data: (.*?)\r\nAutore: (.*?)\r\nTitolo:
(.*?)\r\nCodice:(.*?)Fine codice/si';
if (preg_match ($pattern, $content, $matches)) {
	print_r ($matches);
}
?>



Io a volte preferisco utilizzare strpos e substr, e parsare la stringa 
carattere per carattere, ma se il formato è assolutamente stabile puoi 
anche ricorrere ad una soluzione più "bruta":
<?php
$rows = file($filename);
$data = trim(substr($rows[0], strpos($rows[0], ':'));
$autore = trim(substr($rows[1], strpos($rows[1], ':'));
$titolo = trim(substr($rows[2], strpos($rows[2], ':'));
$rows = array_slice($row, 4); // elimina le righe prima di 
testo_su_pi'_linee
array_pop($rows); // elimina l'ultima riga, quella con Fine codice.
$testo = join("\n", $rows);
?>
non ho testato il codice per cui potrebbe esserci qualche errore...
Dipende da quanto flessibile deve essere la tua soluzione.

 
Molto pulito! La cambierei solo in questo modo:
$pattern = 
'/Data:\s*(.*?)\s*(?:\r\n|\n)Autore:\s*(.*?)\s*(?:\r\n|\n)Titolo:\s*(.*?)(?:\r\n|\n)Codice:(?:\r\n|\n)(.*?)Fine 
codice/si';
Solo un minimo più flessibile.

 <?php 
La tua laconicita', unita alla tua precisione, parla con la voce 
dell'essenzialita' :-)
Mi fa un pochino sentire stupido, ma non e' detto che la verita' debba 
essere sempre per forza piacevole. Io, ragionando lentamente, mi ero 
figurato una soluzione assolutamente diversa al problema, segno che ero 
un po' fuori strada.
Ora studio la tua risposta, mi interessa soprattutto capire "come", e 
non tanto avere "la pappa fatta".
Grazie per l'aiuto, vorrei averti come maestro. Se per caso prevedi di 
insegnare, fammi sapere dove potermi prenotare!!! :-)


 anche ricorrere ad una soluzione piů "bruta":
Franco, ti ringrazio moltissimo per l'aiuto. Si', il formato del file 
dovra' essere assolutamente stabile; anche io stavo pensando ad una 
soluzione basata su substr, ho appena realizzato una funzioncina rapida 
rapida che serve per mostrare le prime n parole di una stringa seguite 
dal classico link "leggi tutto", utilizzando proprio substr. Pero' mi 
sono confuso le poche idee cercando di mettere insieme una regexp, e mi 
sono incartato del tutto :-)
Pasiensa, l'importante e' che oggi ho imparato un paio di cose preziose :-)


 ?>
Tornato dal lavoro, ho fatto un test al volo per provare e il codice che 
hai riportato non funziona.
Ora inizio a studiarmelo per cercare di capire prima cosa vuole fare, 
poi dov'e' l'errore. Insomma, una complicazione in piu' :-)
La didattica non e' una cosa facile :-)


 che hai riportato non funziona.
Definisci "non funziona".
-- 
I am what I am, I do what I can


 Definisci "non funziona"
"Non funziona". Si dice di cio' che non produce il risultato atteso, 
senza pero' effettivamente spiegare se quello che si ottiene e' il 
risultato corretto ma inaspettato :-)
In ogni caso, un brutale copia/incolla del tuo codice non produce alcun 
risultato a video, quindi in parole povere non so cosa il tuo codice fa. 
Nessun output, niente messaggi di errore, niente di niente.
Ecco il codice:
<?php
$content = file_get_contents ('pippo.txt');
$pattern = '/Data: (.*?)\r\nAutore: (.*?)\r\nTitolo:
(.*?)\r\nCodice:(.*?)Fine codice/si';
if (preg_match ($pattern, $content, $matches)) {
	print_r ($matches);
}
?>
Ovviamente il file pippo.txt e' correttamente presente sul server. Mi 
sembrerebbe, ma non ci giurerei, che $pattern sia sbagliata la' dove 
dice "Codice:(.*?)Fine codice/si"; io forse scriverei:
Codice:(.*?)\r\nFine codice/si
Ma anche cosi', non cambia nulla...


 codice fa. Nessun output, niente messaggi di errore, niente di niente.
http://setecastronomy.stufftoread.com/go.php?ID=46
A me da il risultato corretto, inoltre se fai copia ed incolla da un
post USENET, fai attenzione agli accapo inseriti dal newsreader.


 post USENET, fai attenzione agli accapo inseriti dal newsreader.
Giustissimo, gli accapo! Mi cospargo il capo di abbondantissima cenere, 
e mi vergogno come l'ultimo dei deficienti!!! :-(((
Il sistema funziona perfettamente (come ovvio), io filo a studiare, in 
silenzio.
Se posso approfittare ancora della tua pazienza, farei una domanda: nel 
codice tu crei la regola per la suddivisione del testo nella variabile 
$pattern:
$pattern = '/Data: (.*?)\r\nAutore: (.*?)\r\nTitolo: 
(.*?)\r\nCodice:(.*?)Fine codice/si';
Io avrei messo un "\r\n" prima di "Fine codice/si", perche' la stringa 
"Fine codice" e' a capo dopo il testo.
Perche' la mia idea e' sbagliata?


 stringa "Fine codice" e' a capo dopo il testo.
Puoi metterla, non e' un problema. Personalmente quando credo delle
espressioni regolari cerco di mantenerle semplici ed il piu' generiche
possibili. Non sapendo se "Fine codice" fosse o meno preceduto da
"\r\n" ho preferito non inserirlo.
-- 
I am what I am, I do what I can
Vuoi supportarmi? 
http://url.repository.biz/go/3E


 Puoi metterla, non e' un problema
Ok, ti ringrazio moltissimo per le spiegazioni! Mi hai dato un aiuto 
immenso, anche se ancora non posso dire di riuscire a padroneggiare bene 
le regexp. Devo fare esercizio, manuale alla mano!
