- Home
- Categorie
- Coding e Sistemistica
- PHP
- Convertire CSV in XML...
-
Il file CSV contiene nella prima riga i descrittori e poi dalla seconda in avanti tutti i valori.
A me serve una classe in cui passo come parametri i nodi in ordine, ovvero: AnnoScolastico, ClasseFreq, Matricola
Il programma deve estrarre il primo anno disponibile, poi la classe, successivamente la matricola e per finire tutte le informazioni che appartengono a quella determinata matricola. Il risultato dovrà quindi essere:
[PHP]
<2004-2005> --> AnnoScolastico
<1AS> --> ClasseFreq
<11111> --> Matricola
<esito>AMMESSO</esito> --> Informazioni dello studente
....
<alunno>Mario Rossi</alunno>
</11111>
<11112>
<esito>AMMESSO</esito>
....
<alunno>Mario Rossi</alunno>
</11112>
</1AS>
</2004-2005>
<2005-2006> --> AnnoScolastico
<2AS> --> ClasseFreq
<11113> --> Matricola
<esito>AMMESSO</esito>
....
<alunno>Mario Rossi</alunno>
</11113>
<11114>
<esito>AMMESSO</esito>
....
<alunno>Mario Rossi</alunno>
</11114>
</2AS>
</2005-2006>
Ecc.....
[/PHP]Spero di essermi spiegato.
Grazie per l'interessamento
-
Mi piacciono le sfide... Provo a vedere ... senza impegno... Cosa riesco a fare..
Spero solo di aver capito bene il tutto.
L'ordine delle colonne nel file CSV resta comunque quello vero?
-
Grazie per la tua disponibilità.
Il mio vero problema sta nel fatto che il file CSV che acquisisco può cambiare, nel senso che può contenere un diverso numero di colonne, argomenti, ecc...
Se rimanesse tutto così riuscirei a farlo. Il mio obiettivo era quello di trovare un algoritmo generale che mi permetta di generare il file XML partendo dal CSV, passando come parametri la struttura del file XML.
-
Allora l'unica cosa che vedo è che per forza di cose, la prima colonna debba essere il primo nodo, la secoda colonna il nodo figlio e cosi via. Ordinati questo si...
-
Allora provo a fare come dici te, ordino in base ai nodi.
Quindi sarebbe da ordinare le righe secondo l'ordine delle colonne, in modo tale da avere le righe in successione.
Ovvero ordinare prima per annoScolastico, poi per Classe e infine per matricola
-
Si quindi iniziare un nuovo nodo nel momento in cui il nodo successivo non cambia.
Sembra banale ma credo ci si debba lavorare un pò...
-
Mi sei stato molto d'aiuto...
Domani mattina provo a buttare giù un pò di codice.
-
Fai informatica?
L'ho fatta anche io a mio tempo...
Magari se hai un pò di codice butta anche qua che se qualcuno passa...
L'unione fa la forza...
Ultima notizia... numero di colonne variabili?
-
Si faccio l'ABACUS a Verona...
Ovviamente dopo posto tutto. Le colonne possono andare da un minimo di 3 ad un massimo di 15.
-
La soluzione che ti propongo è di leggere il file CSV, creare un array associativo con la struttura che ti serve (ti basta esplodere la riga e usare key/value che ti servono) e poi fare un dump XML del tutto.
Qui trovi un esempio di come convertire un hash in un documento XML: h t t p ://stackoverflow.com/questions/99350/php-associative-arrays-to-and-from-xml
HTH, ciao!
-
Interessante il link che hai postato, provo a vedere come potrei sfruttarlo.
Questa mattinata ho concluso questo:
[PHP]
function csv2xml($lastTag){
$myXml = "";
$csv = $this->openCsv();
//Suddivido tutto le righe
$rowCsv = explode("\n", $csv);//Suddivido ogni singola riga in un sottoarray for($j=0; $j<count($rowCsv); $j++){ $rowCsv[$j] = explode(";", $rowCsv[$j]); } //Determino la posizione dell'ultimo tag $posLastTag = array_search($lastTag, $rowCsv[0]); //Analizzo ogni singola riga $tagInsert = array(); for($i=1; $i<count($rowCsv); $i++){ //echo "RIGA: $i"; for($j=0; $j<count($rowCsv*); $j++){ if($j <= $posLastTag and in_array($rowCsv*[$j], $tagInsert) === false){ $jump = false; if($i > 1 and $j <= $posLastTag){ $jump = true; for($k=$posLastTag; $k >= $j; $k--){ //echo "chiudo un TAG (".$tagInsert[$k].") $j<br/><br/>"; $myXml .= "</".$tagInsert[$k].">\n\n"; $tagInsert[$k] = ""; } } if($i > 1 and $jump == false){ //echo "chiudo un tag (".$rowCsv[$i-1][$j].")<br/><br/>"; $myXml .= "</".$rowCsv[$i-1][$j].">\n\n"; unset($tagInsert[array_search($rowCsv[$i-1][$j], $tagInsert)]); } //echo "aggiungo il tag (".$rowCsv*[$j].")<br/><br/>"; $tagInsert[$j] = $rowCsv*[$j]; $myXml .= "<".$rowCsv*[$j].">\n\n"; } if($j > $posLastTag){ //echo "Scrivo tag alunno<br/>"; $myXml .= "<".trim($rowCsv[0][$j]).">".trim($rowCsv*[$j])."</".trim($rowCsv[0][$j]).">\n"; } //print_r($tagInsert); //echo "<br/>"; } } return $myXml; }
[/PHP]
Il parametro della funzione è l'ultimo nodo necessario, ovvero la matricola nel mio caso.
-
L'ho trovato anche io quel riferimento ieri.
Non mi convince molto però l'xml che ne crea...