Un Evento Unico. 5 Sale. 27 Interventi. SEO, SOCIAL, E-Commerce, Mobile, Turismo.
CLICCA QUI e SCOPRI DI PIù X Chiudi
 
Forum GT: Condividiamo idee e conoscenza Forum GT: Condividiamo idee e conoscenza


Condividi questo contenuto nei Social Network:
Ti stiamo aspettando: Registrati subito e gratis. Entra a far parte di una delle comunità più attive in Italia. Se hai dimenticato i tuoi dati li puoi recuperare subito.


Vai indietro   Forum per Webmaster: Condividiamo Idee e Conoscenza > Sviluppo e Gestione siti web > Php - Mysql > Scripting e Risorse utili
Benvenuto! Forum Regole FAQ Lista utenti Calendario Segna come letti


Rispondi
 
LinkBack Strumenti di discussione
Vecchio 29-08-07, 22:55   #1 (permalink)
 
Data di registrazione: Aug 2006
Messaggi: 704
[Tutorial] Script per importare un file testuale in mysql

Ciao, volevo sapere come faccio a far in modo che dal mio file txt inserire i dati all'interno del mio database

Il problema è che il file è strutturato così

1 - nome
2 - nome

ecc..

io vorrei fare in modo che la prima colonna vada dentro una tabella id mentra l'altra in un'altra tabella per dire oggetti...

Come posso fare??

__________________
Giochi flash
Ale90 non in linea   Rispondi citando
Vecchio 30-08-07, 01:04   #2 (permalink)
MZ
Moderatore
 
L'avatar di MZ
 
Data di registrazione: Jun 2005
Ubicazione: Lecce-Torino
Messaggi: 509
Ciao Ale90,

Oggi mi sento generoso

Che ne dite realizziamo un progettino tutti insieme ?

Questa è una cosa che chiedono in tanti, avevo intenzione di scrivere un tutorial da linkare nelle risorse utili per spiegare per bene come risolvere il problema, però visto che si presenta l'occasione... direi vediamo di fare tutti insieme un bel post con le domande e le soluzioni di chi vuole partecipare e vediamo di creare uno scriptino php finale che risolva un pò di problemi.

Che ne pensate ?

Allora comincio io..
Vi propongo lo script che di solito uso io per popolare un database da un file di testo...(è una base migliorabile, ma il problema lo risolve)

Guardate il codice in basso:

Codice:
#!/usr/local/bin/python
prices = open("mio_file sorgente.txt")
template = open("pattern_query.txt")
save = open("file_destinazione.sql","w")

id=1
pattern = template.readline()    
print "\n"
print pattern
print "\n"
while 1:    
    record = prices.readline()    
    if record == "": break    
    riga= pattern.replace('x1',str(id))
    record=record[:-1]
    riga= riga.replace('x2',record)
    print riga
    save.write (riga)  
    id +=1

save.close()
prices.close()
template.close()
Cos'è ?

E' la soluzione al problema scritta con un linguaggio di programmazione che ha un livello di astrazione molto alto: python.

Forse non avete mai visto codice python, però proprio perchè il livello di astrazione è alto non sarà di difficile capirlo per chi ha qualche base di php o di qualche altro linguaggio di programmazione.

Perchè ho postato codice python ?
Questo è il codice che uso per risolvere problemi come quello che hai postato tu, e con pochi passi lo riadatto con l'obiettivo che devo raggiungere.


Come funziona?

mio_file sorgente.txt: è il file con le variabili da inserire nella query in ogni riga.
pattern_query.txt: supponendo che abbiate fatto almeno una query di inserimento esportate da phpmyadmin il file che contiene quella query oppure scrivete voi in un file txt un modello di query.
Modello di query significa al posto scrivete la query per l'inserimento di una riga e al posto dei dati mettete delle variabili.

Il resto penso sia chiaro.. (altrimenti chiedete)
Lo script non fà altro che leggere ogni riga dal file sorgente e creare una query per ciascuna. Tutte le query vengono scritte in file_destinazione.sql

A questo punto?
A questo punto prendo il file destinazione e lo importo nel database, con phpmyadmin.


FATTO


Ora chi prova a tradurre il file in php?

Useremo la traduzione per fare ulteriori miglioramenti su suggerimenti e consigli di tutti.


Partiamo ?

__________________
MZ non in linea   Rispondi citando
Vecchio 30-08-07, 01:16   #3 (permalink)
Esperto
 
Data di registrazione: Jul 2006
Ubicazione: Catania
Messaggi: 255
Invia un messaggio tramite MSN a lorenzosfienti Invia un messaggio tramite Yahoo a lorenzosfienti Invia un messaggio tramite Skype a lorenzosfienti
Ciao,
ci provo io.
Codice PHP:
<?php
$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[$i]['codice']=$riga[0];//Inserisco la prima parte della stringa che rappresenta il codice dell'utente all'interno dell'array
        
$utenti[$i]['nome']=$riga[1];//Inserisco la secondo parte della string che rappresenta il nome dell'utente all'interno dell'array
        
$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
}
?>
__________________
Wimax
lorenzosfienti non in linea   Rispondi citando
Vecchio 30-08-07, 01:40   #4 (permalink)
MZ
Moderatore
 
L'avatar di MZ
 
Data di registrazione: Jun 2005
Ubicazione: Lecce-Torino
Messaggi: 509
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..
__________________

Ultima modifica di MZ : 30-08-07 01:42.
MZ non in linea   Rispondi citando
Vecchio 30-08-07, 02:28   #5 (permalink)
User
 
L'avatar di momino
 
Data di registrazione: Aug 2007
Ubicazione: Casandrino, Napoli
Messaggi: 145
Thumbs up

Codice PHP:
$host "localhost";
$username "root";
$password "";
$database "test";
$tabella "utenti";

$connessione mysql_connect ($host,$username,$password) or die ("Connessione impossibile:::::".mysql_error());
mysql_select_db ($database) or die ("Database non trovato::::".mysql_error());

    for (
$h=0$h<$i$h++)
    {
        
$query 'INSERT INTO '.$tabella.' VALUES ("'.$utenti[$h]["codice"].'", "'.$utenti[$h]["nome"].'")';
        
mysql_query ($query) or die ("query non eseguita:::::".mysql_error());
    } 
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
momino non in linea   Rispondi citando
Vecchio 30-08-07, 03:24   #6 (permalink)
MZ
Moderatore
 
L'avatar di MZ
 
Data di registrazione: Jun 2005
Ubicazione: Lecce-Torino
Messaggi: 509
Bella soluzione Momino!!
Hai inserito la riga direttamente nel database senza nessun altro file di appoggio.

Inserisco il tuo codice in quello proposto da lorenzosfienti:
Codice PHP:

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

$connessione mysql_connect ($host,$username,$password) or die ("Connessione impossibile:::::".mysql_error());
mysql_select_db ($database) or die ("Database non trovato::::".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[$i]['codice']=$riga[0];//Inserisco la prima parte della stringa che rappresenta il codice dell'utente all'interno dell'array
        
$utenti[$i]['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[$i]["codice"].'", "'.$utenti[$i]["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
}
?>
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 ...

__________________

Ultima modifica di MZ : 30-08-07 03:31.
MZ non in linea   Rispondi citando
Vecchio 30-08-07, 03:33   #7 (permalink)
Esperto
 
Data di registrazione: Jul 2006
Ubicazione: Catania
Messaggi: 255
Invia un messaggio tramite MSN a lorenzosfienti Invia un messaggio tramite Yahoo a lorenzosfienti Invia un messaggio tramite Skype a lorenzosfienti
Thumbs up

Codice PHP:
$host "localhost";
$username "root";
$password "";
$database "test";
$tabella "utenti";

$connessione mysql_connect ($host,$username,$password) or die ("Connessione impossibile:::::".mysql_error());
mysql_select_db ($database) or die ("Database non trovato::::".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[$i]['codice']=$riga[0];//Inserisco la prima parte della stringa che rappresenta il codice dell'utente all'interno dell'array
        
$utenti[$i]['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[$i]["codice"].'", "'.addslashes($utenti[$i]["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

__________________
Wimax
lorenzosfienti non in linea   Rispondi citando
Vecchio 30-08-07, 03:53   #8 (permalink)
MZ
Moderatore
 
L'avatar di MZ
 
Data di registrazione: Jun 2005
Ubicazione: Lecce-Torino
Messaggi: 509
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
__________________
MZ non in linea   Rispondi citando
Vecchio 30-08-07, 10:55   #9 (permalink)
User
 
L'avatar di momino
 
Data di registrazione: Aug 2007
Ubicazione: Casandrino, Napoli
Messaggi: 145
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[$i]["codice"].'",...
al massimo si potrebbe usare un accorgimento del genere:
Codice PHP:
$utenti[$h]["nome"] = str_replace ($utenti[$h]["nome"],'"','\"'); 
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!!!
momino non in linea   Rispondi citando
Vecchio 30-08-07, 19:56   #10 (permalink)
MZ
Moderatore
 
L'avatar di MZ
 
Data di registrazione: Jun 2005
Ubicazione: Lecce-Torino
Messaggi: 509
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.


__________________
MZ non in linea   Rispondi citando
Vecchio 30-08-07, 19:57   #11 (permalink)
 
Data di registrazione: Aug 2006
Messaggi: 704
Eccomi di ritorno..

Wow quanta roba..

Siete grandi raga..

Ciao e grazie
__________________
Giochi flash
Ale90 non in linea   Rispondi citando
Vecchio 30-08-07, 20:06   #12 (permalink)
MZ
Moderatore
 
L'avatar di MZ
 
Data di registrazione: Jun 2005
Ubicazione: Lecce-Torino
Messaggi: 509
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.

__________________
MZ non in linea   Rispondi citando
Vecchio 30-08-07, 21:28   #13 (permalink)
User
 
L'avatar di momino
 
Data di registrazione: Aug 2007
Ubicazione: Casandrino, Napoli
Messaggi: 145
E' sempre un piacere, Ale!!
Facci sapere dopo la prova...
momino non in linea   Rispondi citando
Vecchio 31-08-07, 00:13   #14 (permalink)
MZ
Moderatore
 
L'avatar di MZ
 
Data di registrazione: Jun 2005
Ubicazione: Lecce-Torino
Messaggi: 509
Segnalato il Topic in:

http://www.giorgiotave.it/forum/php-...tml#post216910

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

__________________
MZ non in linea   Rispondi citando
Vecchio 31-08-07, 13:48   #15 (permalink)
Esperto
 
L'avatar di Gorka
 
Data di registrazione: Apr 2006
Ubicazione: Ragusa
Messaggi: 1,676
Invia un messaggio tramite MSN a Gorka Invia un messaggio tramite Skype a Gorka
Aggiungo un altro modo, che sfrutta delle funzionalità proprie di mysql:

Codice 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(); 
Gorka non in linea   Rispondi citando
Rispondi


Strumenti di discussione

Regole di scrittura
Non puoi postare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi allegare file
Non puoi editare i tuoi post

BB code is Attivo
smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Attivo
Pingbacks are Attivo
Refbacks are Disattivato
Vai al forum



Tutti gli orari sono GMT +3. Attualmente sono le 20:19.




Forum GT - © 2004-2009 GT idea S.r.l P.iva 02418200800 - Privacy/Disclaimer

SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.