Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208

    CSV complesso da importare in Mysql tramite PHP

    Salve,
    sono all'apice di un problema abbastanza serio.
    Devo trasferire una serie abbastanza ampia di records accumulati negli anni in un file WDB di Microsoft Works 9.

    Il problema è serio perchè il top del top sarebbe stato trasformare il db da WDB in Access e poi passare tutto con un tool che ho già trovato che semplicemente trasforma tutto in un file per mysql, senza codici. Se non fosse che Works9 non interagisce con Access, feature genialmente eliminata dalla versione 5 in poi.

    Il punto: ho trasformato i dati in Excel e titolato la struttura, inutile dire che i dati non fuoriescono in un ordine preciso, ma parecchio sfalsato e da riordinare prima di eseguire le varie query su varie tabelle per ogni riga di dati. Ho a disposizione la mappatura coi campi, ma mi sono reso conto che PHP non interagisce con i nomi delle colonne (A, B, AB, CW etc.), cosa che mi avrebbe fatto comodo.

    A questo punto la domanda è: come metto ordine in questa baraonda?

    Avevo pensato ad un array per ogni tabella in cui memorizzare i dati per eseguire la query finale, di fatto però non ho idea di come associare il dato giusto alla giusta titolatura per poi creare la query. Fare questa cosa con gli indici numerici considerati i 195 campi per ogni riga è più o meno un suicidio. Non ultimo, parte dei dati è legato alla tabella main, ciò significa che per ricavare l'id autoincrementale dovrò prima eseguire la query sulla main e poi ricavare l'id da inserire nelle altre query....e anche qui qualche dubbietto mi resta.

    Qualcuno ha un'idea più semplice o qualche consiglio?

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Preciso meglio:

    questi dati escono purtroppo non catalogati in alcun modo, ma tutti su una linea singola. Peraltro non sono consecutivi ed ordinati, anche se abbastanza regolari. Ma mi devo preoccupare in primis di ordinarli in singoli array. Per questo mi avrebbe fatto mortalmente comodo utilizzare il nome delle colonne in lettere. Ma credo che php non lo permetta, o almeno non ho ancora trovato la funzione giusta se esiste.

    Secondo step, creare le query ad hoc memorizzando l'id dell'inserimento anagrafico in modo tale da garantire che tutti i successivi inserimenti dalla stessa linea si referenzino al giusto record.

    Ma è un bel casino. Ringrazio Microsoft che non è in grado di far parlare decentemente tra loro i propri maledetti programmi...

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Ok, ho cominciato questo macello:

    Codice PHP:
    $file fopen("esport_csv.csv""r") or exit("Impossibile aprire il file!");
            
    $handle fopen("esport_csv.csv""r");

    $titoli fgetcsv($handle4096";");        
    print_r ($titoli);// questo mi serve per catturare in $titoli la linea d'intitolazione del csv, li stampo a video per conferma
            
            
    echo"<br><br>"//formattazione di prova

            
    while ($parse fgetcsv($handle4096";")) {
                
    $NrCampi count($parse);
                echo
    "IL NUMERO DI CAMPI E' $NrCampi <br>";
                 
    $combine array_combine($titoli$parse);
                
    print_r($combine); //anche qui stampo a video per vedere i dati

    i titoli e i dati s'accoppiano bene, ma le linee di dati per ora sono 2 (di prova) e questo script non so perchè ne mostra solo una.


    Il passo successivo immagino che sarà creare un numero di array corrispondente ad ogni inserimento con dentro i relativi indici (purtroppo numerici, diventerò cieco) e utilizzare if di comparazione per fare in modo che ogni dato finisca nell'array giusto. La logica credo sia giusta, mi servirebbe di capire se c'è un metodo più veloce sia come scrittura sia come esecuzione. La fortuna è che questo file, una volta finita la migrazione, cesserà di essere utilizzato.
    Ultima modifica di Korenaar; 12-06-2014 a 16:15

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Posto da solo gli avanzamenti, ma immagino che nessuno abbia grandi idee essendo un caso così particolare.

    Risolto il problema sopra, sto creando una serie di array di confronto con dati manuali che solo io posso indicare al programma. E' la parte più certosina del lavoro. Posto una parte del codice come ulteriore indicazione, se qualcuno ha qualcosa da dire
    Codice PHP:
    $file fopen("esport_csv.csv""r") or exit("Impossibile aprire il file!");
            
    $handle fopen("esport_csv.csv""r");

                    
    $CampiAnagrafici = array('ID','COGNOME','NOME','SESSO',// etc.etc
                    
    $anagraficaINS = array ();

                    
    $quoteass94 = array('0' =>'1994');                $quoteass95 = array('0' =>'1995');        ...//continua la serie di inizializzazione di array, le tabelle in tutto sono 5 e per ciascuna dovrò scrivere un array di comparazione a mano
            
            
    $titoli fgetcsv($handle4096";");
            while (
    $parse fgetcsv($handle4096";")) {
                
    $NrCampi count($parse);
                echo
    "IL NUMERO DI CAMPI E' $NrCampi <br>";
                
    $combine array_combine($titoli$parse); 
               
    //print_r($combine);
                
    echo"<br><br>";

                            foreach (
    $combine as $key => $value) {
                                   if(
    in_array($key$CampiAnagrafici)) {
                                          
    $anagraficaINS[$key] = $value;
                                   ...
    //serie di altri if per matchare gli indici in altri array ancora da scrivere

                                        
    }
                                }
            } 
    Al termine di questa cosa avrò una serie di array ai quali accoppiare una query d'inserimento.
    Mi rimane il problema che nella parte anagrafica ci sono alcuni valori in più (tipo il campo REGIONE che in questi dati non c'è), ma l'opzione più facile in questo caso magari è eliminare momentaneamente il campo dal nuovo DB e riaggiungerlo una volta migrato il tutto.

    Se qualcuno ha qualcosa da suggerire è benvenuto, dal canto mio ho aperto il topic all'inizio perchè ero in difficoltà, ne sto pian piano venendo fuori. Ci tengo comunque ad aggiornarlo finchè vado avanti perchè potrebbe essere un caso specifico utile a qualcun'altro in futuro.
    Ultima modifica di Korenaar; 12-06-2014 a 17:29

  5. #5
    Ragioniamo bene sul tuo problema:
    A parte che microsoft ha fatto la scelta puramente commmerciale di non far dialogare works e access..

    Tu hai portato tutti i dati in excel.
    Se sono diverse tabelle, avrai diversi fogli excel. Quindi diversi csv da importare. Giusto ?

    E' impossibile che excel ti esporti tutto su una riga sola di csv. Una tabella è una tabella e come tale la ritrovi nel csv.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    No.
    L'excel fonte mi spara una riga per ogni record, con ordine dei dati abbastanza casuale anche se regolare record per record.
    Le tabelle di destinazione sono diverse.

    Ho risolto concettualmente così:

    1) Ho titolato sulla prima riga a mano l'excel confrontando l'ordine dei dati con il file Works (dolore)
    2) Ho raccolto la prima riga di titolazione e fatto combine_array con ciascuna riga di dati per ottenere l'array Anagrafica(titolo => valore)
    3) Sulla base di questo array, ho creato altri array manualmente con all'interno i valori di ogni insert presenti nella riga originaria e disordinata dei dati e confrontato Anagrafica singolarmente questi array con la funzione in_array. Questo per suddividere la riga in vari gruppi d'inserimento dati.
    4) A questo punto ho i dati disordinati ma divisi per tabelle. Sempre manualmente, ho creato in vari array l'ordine dei dati sulle tabelle del db e fatto il confronto fra l'array disordinato e il corrispondente ordinato per ottenere finalmente l'ultimo array con dentro i dati ordinati nel modo specifico.

    A questo punto chiudo con un ciclo foreach che mi crea la query con i valori dell'array finale Ordered.

    Tutte queste operazioni all'interno di un ciclo while che ripete le operazioni per ogni riga.

    Meccanismo complesso, forse non elegantissimo, ma fa esattamente quello che mi serve.

    P.S ho dimenticato di sottolineare che per legare con l'id le varie tabelle, dopo l'inserimento anagrafico vado a ricavarmi il valore dell'ultimo inserimento (quello appena fatto quindi) con la query max(id), e appendo questo valore all'interno di ogni array laddove necessario.
    Ultima modifica di Korenaar; 16-06-2014 a 16:06

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.