[PHP] Dividere un campo di testo in più campi

gandalf1959

Utente Attivo
21 Nov 2013
208
1
18
Buongiorno a tutti,
sono un po' arrugginito nell'utilizzo di php e mysql, ho cercato nel forum ma non sono riuscito a trovare quello che mi serve.
Ho un db MySql di ricette.
Uno dei campi contiene gli ingredienti, scritti così (unico campo, tipo text):
1 kg di cipolle
3 patate
.....

oppure:
cipolle [TAB] 1 kg
patate [TAB][TAB] n. 3
....

Ora dovrei dividere le singole righe di ingredienti inserendo in tre campi distinti quantità, unità di misura, ingrediente.
Poichè si tratta di un db piuttosto grande, vorrei evitare di fare il lavoro a mano.
Naturalmente va benissimo anche solo che la quantità vada nella colonna corretta (è sempre un numero), se poi dovesse ogni tanto invertirmi l'unità di misura con l'ingrediente non fa nulla, un po' di editing successivo andrà comunque fatto.

Da dove comincio? :-)
Grazie per i suggerimenti.
 
Per semplificare il problema, mi basterebbe estrarre il numero che poi metterei in un altra tabella insieme all'id della ricetta.
Potrei anche mettere il resto del testo in un altro campo della stessa tabella; poi farò una revisione manuale.
Questo semplificherebbe la cosa?
Grazie
Maurizio
 
Ciao Gandalf,
estrarre un numero da una stringa non è poi così complicato con preg_match: (ho fatto una prova con i due esempi
di stringa che avevi postato)

PHP:
$stringa = 'patate [TAB][TAB] n. 3';
if (preg_match('/[0-9]+/',$stringa,$result)) {
echo $stringa;
echo '<br>Quatità: '.$result[0];
}

per le unità di misura (è una soluzione un po' 'fatta in casa' ma funziona) dovresti inserirle tutte (kg,l,n) in questo modo

PHP:
$stringa = 'patate [TAB][TAB] n. 3';
if (preg_match('/[0-9]+/',$stringa,$result)) {
echo $stringa;
echo '<br>Quatità: '.$result[0];
}
if (preg_match('/[kg|gr|n.|l]+/',$stringa,$result)) {
echo '<br>Unità dsi misura: '.$result[0];
}

Sempre che abbia ben interpetato bene ciò che intendi fare
 
Intanto grazie, applico, provo e poi ti aggiorno.
Quello che devo fare è splittare il contenuto del campo "Ingredienti" che al momento è un semplice campo di testo multiriga in tre "colonne" distinte (quantita, unita di misura, prodotto).
I tre dati ottenuti li butto in un'altra tabella del db insieme al codice della ricetta (tramite cui poi ricollegherò le informazioni).
Mi applico.
A presto
 
Scusa una cosa...
il campo ha più righe, non una sola.
Riesco a dirgli che deve analizzare il testo riga per riga? Cioè quando trova un "A capo" diventa una nuova stringa?
 
Ma gli 'ingrerdienti' si trovano in una tabella o in un file TXT? Se si trovano in una tabella,. ad ogni riga letta valorizzi la stringa col contenuto del campo, altrimenti c'è una funzione (al momento non ricordo quale) che trasforma un fileTXT in un array
 
ho fatto delle prove su un campo mediumtext, preg_match cerca su tutto il campo (anche multiriga) solamente la prima occorrenza di un numero mentre se (come credo) il campo contiene più ingredienti, e quindi più numeri, devi usare preg_match_all. Dovresti farmi un esempio del campo
 
Grazie.
il tipo di campo è "medium text" e un contenuto di esempio è il seguente:

Pasta strudel 450 gr
Carote 200 gr
Zucchine 200 gr
Porri 100 gr
Barbabietole 100 gr
Sedano 200 gr
Olio 140 gr
Vino bianco 3 dl
Panna di Soia 3 dl
Fondo di verdura 2 dl
Erba cipollina 20 gr
Sale
Pepe

Ti basta? Se serve altro chiedi pure...
 
Ciao Gandalf.,
scusa ma ho avuto parecchi problemi col computer; non so se nel frattempo hai risolto ma, nel dubbio, ti mando lo script.
Sicuramente qualcosa lo dovrai sistemare a mano. La difficoltà è mettere ogni ingrediente su una riga perchè, anche se nell'esempio che mi hai fornito sono ognuno su una riga, per il computer è un'unica, lunghissima variabile con tutti gli ingredienti uno di fianco all'altro. Però ho visto che ogni ingrediente inizia con la lettera maiuscola, quindi la riga è composta da una stringa compresa tra una lettera maiuscola e l'altra (tranne Panna d Soia che quindi lo devi scrivere tutto minuscolo) . Questo è lo script:

PHP:
$testo = 'Pasta strudel 450 gr
Carote 200 gr
Zucchine 200 gr
Porri 100 gr
Barbabietole 100 gr
Sedano 200 gr
Olio 140 gr
Vino bianco 3 dl
Panna di soia 3 dl
Fondo di verdura 2 dl
Erba cipollina 20 gr
Sale
Pepe';

echo $testo.'<br>';
preg_match_all('/[A-Z]/',$testo,$result);
 
$lettere = $result[0];
$nr_occ = count($lettere);
//echo $nocc;
echo '<br><br>';


for ($ind=0;$ind<$nr_occ;$ind++) {
     $posto = strpos($testo,$lettere[$ind+1]);
     $stringa = substr($testo,0,$posto);
     $testo = substr($testo,$posto);
     if ($ind==$nr_occ-1) {
         $stringa = $testo;
     }
     //echo $stringa.'<br>';
     $trovato = preg_match('/[0-9]+/',$stringa,$result);
     if ($trovato==1) {
         $posto = strpos($stringa,$result[0]);
         $ingrediente = substr($stringa,0,$posto);
     } else {
         $ingrediente = $stringa;
     }
     $quantita = $result[0];
     preg_match('/(gr|dl|kg|lt)/',$stringa,$result);
     $u_mis = $result[0];
     if ($quantita=='') {
          echo 'ingrediente: '.$ingrediente.'<br>';
     } else {
            echo 'ingrediente: '.$ingrediente.' quantita: '.$quantita.' unita di misura: '.$u_mis.'<br>';
     }
}


Zorro
 

Discussioni simili