• User Attivo

    Ottimo lorenzosfienti, che velocità!!

    Bella l'idea di utilizzare l'array in quel modo, se seguiamo questa strada alla fine penso che sia anche semplice generalizzare lo script, dando la possibilità di scegliere da un form il separatore e di specificare altre caratteristiche del file sorgente.

    Molto bene..

    Vediamo cosa manca:

    1. Il file contente il modello di query e relativa gestione
    2. Il file sql finale che conterrà le query da importare

    Per quanto riguarda il punto 2 la cosa è semplice:
    Apriamo un file in scrittura e ad ogni ciclo scriviamo la query che creiamo

    Per quanto riguarda il punto uno ci sarebbero diversi percorsi:
    un modo semplice (ma forse non efficacissimo) è quello che ho usato nello script python:

    • Scrivere la query con le variabili in un file, poi nello script php cerchiamo quello variabili e le sostituiamo con la riga dell'array utenti appena scritta.

    ...

    Facciamo un passo alla volta..


  • User Attivo

    [php]
    $host = "localhost";
    $username = "root";
    $password = "";
    $database = "test";
    $tabella = "utenti";

    $connessione = mysql_connect ($host,$username,$password) or die ("Connessione impossibile

    ".mysql_error());

    for ($h=0; $h<$i; $h++)
    {
        $query = 'INSERT INTO '.$tabella.' VALUES ("'.$utenti["codice"].'", "'.$utenti["nome"].'")';
        mysql_query ($query) or die ("query non eseguita
    :::::
    ".mysql_error());
    }
    

    [/php]

    ovviamente la tabella deve essere creata dal pannello di amministrazione di Sql, e puoi cambiare le variabili a tuo piacimento.;)
    Dovrebbe andare, fatemi sapere se c'è qualcosa di sbagliato...
    Momino


  • User Attivo

    Bella soluzione Momino!!
    Hai inserito la riga direttamente nel database senza nessun altro file di appoggio. :vai:

    Inserisco il tuo codice in quello proposto da lorenzosfienti:
    [PHP]

    <?php
    $host = "localhost";
    $username = "root";
    $password = "";
    $database = "test";
    $tabella = "utenti";

    $connessione = mysql_connect ($host,$username,$password) or die ("Connessione impossibile

    ".mysql_error());

    $utenti=array();//creo un array dove vengono conservati tutti gli utenti presenti nel file
    $i=0;//creo un indice per l'array
    if ($file=fopen("file.txt","r"))//Controllo se si riesce ad aprire in modalita lettura ("r") il file "file.txt"
    {
    while (!feof($file))
    {
    $riga=fgets($file,255);//Leggo una riga intera del file e la inserisco in una variabile
    $riga=explode("-",$riga);//Taglio la stringa nel punto in cui è presente il carattere -
    $utenti*['codice']=$riga[0];//Inserisco la prima parte della stringa che rappresenta il codice dell'utente all'interno dell'array
    $utenti*['nome']=$riga[1];//Inserisco la secondo parte della string che rappresenta il nome dell'utente all'interno dell'array

        $query = 'INSERT INTO '.$tabella.' VALUES ("'.$utenti*["codice"].'", "'.$utenti*["nome"].'")';
        mysql_query ($query) or die ("query non eseguita
    :::::
    ".mysql_error());
    
        $i++//Incremento l'indice
    }
    

    }
    else
    {
    echo "Impossibile aprire il file";//Nel caso in cui non si riesca ad aprire il file
    }
    fclose($file);chiudo il descrittore del file
    }
    ?>
    [/PHP]

    Direi che è già una bella soluzione di base...con la strada proposta da momino molte cose diventano facilmente generalizzabili.

    Mancherebbe il controllo su apici e caratteri speciali, necessari quando si inserisce in un database (pensate a quando bisogna inserire descrizioni) però come script di base è molto carino..

    Ad occhio e croce mi sembra che dovrebbe funzionare, se qualcuno lo provasse e trovasse errori..

    Se c'è qualcuno che vorrebbe aggiugere qualcos'altro ...

    :ciauz:


  • User Attivo

    [PHP]
    $host = "localhost";
    $username = "root";
    $password = "";
    $database = "test";
    $tabella = "utenti";

    $connessione = mysql_connect ($host,$username,$password) or die ("Connessione impossibile

    ".mysql_error());

    $utenti=array();//creo un array dove vengono conservati tutti gli utenti presenti nel file
    $i=0;//creo un indice per l'array
    if ($file=fopen("file.txt","r"))//Controllo se si riesce ad aprire in modalita lettura ("r") il file "file.txt"
    {
    while (!feof($file))
    {
    $riga=fgets($file,255);//Leggo una riga intera del file e la inserisco in una variabile
    $riga=explode("-",$riga);//Taglio la stringa nel punto in cui è presente il carattere -
    $utenti*['codice']=$riga[0];//Inserisco la prima parte della stringa che rappresenta il codice dell'utente all'interno dell'array
    $utenti*['nome']=$riga[1];//Inserisco la secondo parte della string che rappresenta il nome dell'utente all'interno dell'array

         //Ho inserito la funzione per controllare gli apici
        $query = 'INSERT INTO '.$tabella.' VALUES ("'.$utenti*["codice"].'", "'.addslashes($utenti*["nome"]).'")';
        mysql_query ($query) or die ("query non eseguita
    :::::
    ".mysql_error());
    
        $i++//Incremento l'indice
    }
    

    }
    else
    {
    echo "Impossibile aprire il file";//Nel caso in cui non si riesca ad aprire il file
    }
    fclose($file);chiudo il descrittore del file
    }
    [/PHP]


  • User Attivo

    Spettacolo!!

    Ora mancano poche semplici modifiche per avere uno script molto carino e facile da usare anche quando cambia la tipologia di file sorgente.

    Bisognerebbe generalizzare il separatore ($separatore = "-") in questo modo che lo usa guarda la prima parte dello script e imposta i parametri del suo specifico file sorgente e destinazione in quella sezione.

    Altra cosa da generalizzare è il numero di campi per riga.

    Esempio
    $numero_campi="2"

    Dopo che si fà l'explode l'array utente si riempie in un ciclo while (o for)

    Fatto questo una semplice interfaccia utente che scrive i paramentri in alto e diventa uno script molto semplice da usare..

    Comunque è già uno script che dovrebbe fare il suo dovere..

    Ottimo ragazzi


  • User Attivo

    Grazie tante MZ, amo lavorare in gruppo!!
    Comunque non dovrebbero esserci problemi per gli apici, perchè ho inserito il tutto in doppi apici
    ...VALUES ("'.$utenti*["codice"].'",...
    al massimo si potrebbe usare un accorgimento del genere:
    [PHP]$utenti["nome"] = str_replace ($utenti["nome"],'"','"');[/PHP]
    in modo da non interrompere la stringa con doppi apici "subdoli" 😛

    Penso che non serva la variabile del numero di campi da inserire, in quanto è già impicito nella struttura della tabella. La query ke ho scritto io la riempie per intero, quindi si presume ke ki programma lo script abbia anke creato il database, la tabella e voglia riempirla SEMPRE in TUTTI i suoi campi...
    Altrimenti la query dovrebbe cambiare...
    Se siete interessati sviluppo anche questa alternativa, mi divertono le cose complicate...
    Intanto vado a mare!!!:eheh:


  • User Attivo

    Grazie a te momino e a lorenzo..

    Si penso che hai ragione sugli apici..

    Bhe direi che il problema è risolto poi lo script ognuno la può personalizzare secondo le proprie esigenze.

    :ciauz:


  • User Attivo

    Eccomi di ritorno..

    Wow quanta roba..

    Siete grandi raga..

    Ciao e grazie 😉


  • User Attivo

    Ciao Ale90,

    Se lo provi e magari trovi qualcosa che non funziona o hai qualche consiglio su come migliorarlo facci sapere in modo da avere per tutti uno script funzionante.

    :ciauz:


  • User Attivo

    E' sempre un piacere, Ale!!
    Facci sapere dopo la prova...


  • User Attivo

    Segnalato il Topic in:

    http://www.giorgiotave.it/forum/php-mysql/29412-tutorial-script-thread-utili.html#post216910

    questo non significa che la discussione sia chiusa, se ci sono altre cosette da implementare, problemi con lo script continuiamo qui.

    :ciauz:


  • Super User

    Aggiungo un altro modo, che sfrutta delle funzionalità proprie di mysql:

    [php]$query = "LOAD DATA INFILE 'file.txt' IGNORE INTO TABLE ".$tabella ." FIELDS TERMINATED BY '-' LINES TERMINATED BY '\n'";

    if (mysql_query ($query)) echo mysql_affected_rows()."linee inserite";
    else echo mysql_error();[/php]


  • Moderatore

    si in questo modo fai fare tutto a mysql ma se il file è abbastanza grande mysql và in cresh a meno che il server su cui si appoggia non sia solo ed unicamente per quello....

    provare per credere 🙂


  • Super User

    Io ho provato in locale con file csv più grandi di 4 mb e ho ottenuto un notevole miglioramento delle prestazioni rispetto all'uso di script in PHP (con l'uso ad esempio di fgetcsv).

    Adesso lo devo testare su un server dedicato, speriamo vada bene.


  • User Attivo

    Questa mi è proprio nuova...:():


  • Moderatore

    io intendevo mooolto più grandi magari dovevo specificare che io ho fatto questi test su file intorno ai 16MB

    per lo script php io utilizzavo una divisione in più in modo che ad ogni tabella lo script fermava il suo accesso a mysql ad ogni tabella in modo da non appesantire il server.

    Comunque la tua soluzione è la più veloce sin'ora 😄


  • User Attivo

    Ottima guida veramente...
    Nel mio file CSV separati da puntoevirgola (;) come faccio a saltare la prima riga che contiene le intestazioni delle colonne?
    Grazie!


  • Super User

    Dopo LINES TERMINATED... puoi aggiungere IGNORE 1 LINES


  • User Attivo

    Intendevo nello script PHP....


  • User Attivo

    Ciao a tutti,
    ho utilizzato lo script PHP come mi è stato esposto sopra.
    Funziona alla perfezione solo che siccome il mio file è un file contenente migliaia di atleti e per ogni atleta è specificata la società di appartenenza.
    Con questo script dovrei prima prendermi solo le squadre (sempre dallo stesso file).
    Il problema è che le prendo tutte le righe si creerebbero dei doppioni...allora ho cercato di adattarlo così:
    [PHP]$societa=array();//creo un array dove vengono conservati tutti gli utenti presenti nel file
    $i=0;//creo un indice per l'array
    $doppione=0;//creo un contatore per i doppioni
    if($file=fopen("atleti.txt","r")){
    while (!feof($file)){
    $riga=fgets($file,255);//Leggo una riga intera del file e la inserisco in una variabile
    $riga=explode(";",$riga);//Taglio la stringa nel punto in cui è presente il carattere -
    $progressivo=$riga[10];
    $regione=$riga[9];
    $codice=$regione."-".$progressivo;
    if($i>=1){
    for($x=0;$x<=$i-1;$x++){
    if($codice==$societa[$x]['codReg_Soc']."-".$societa[$x]['codPrg_Soc'])
    $doppione=$doppione+1;
    }
    }
    if($doppione==0){
    $societa*['codReg_Soc']=$riga[9];//Inserisco la prima parte della stringa che rappresenta il codice dell'utente all'interno dell'array
    $societa*['codPrg_Soc']=$riga[10];//Inserisco la secondo parte della string che rappresenta il nome dell'utente all'interno dell'array
    $societa*['denominazione_Soc']=$riga[11];
    }
    $doppione=0; //Azzero nuovamente il contatore dei doppioni
    $i++;//Incremento l'indice
    }
    }else
    echo "Impossibile aprire il file";//Nel caso in cui non si riesca ad aprire il file
    fclose($file); //chiudo il descrittore del file[/PHP]

    Lo script è lentissimo, però funziona. Ma c'è un problema...su 85 Società, lui me ne estra solo 80.
    Come mai?
    Sbaglio qualcosa?
    Grazie!!