Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    75

    Inserire il contenuto di un file csv in una tabella del database (MariaDB).

    Buonasera,

    dopo svariati anni sono di nuovo alla prese con i database e purtroppo ricordo quasi nulla di quel poco che sapevo. Oltre a PHP 7.4, utilizzo phpMyAdmin e MariaDB (ho solo questo database sul NAS).

    Vengo subito al dunque...

    Devo caricare il contenuto di un file CSV in una tabella del database (sono circa 65.000 righe per 18 colonne). Ho creato la tabella nel database con le 18 colonne (ho impostato VARCHAR 255 a tutte). Poi ho inserito la 19� colonna che ho chiamato 'id' (INT 10) con chiave primaria ed auto incremento.

    Utilizzo questo codice trovato in rete per caricare il contenuto del file:
    codice:
    $cons = mysqli_connect("$sqlname", "$username","$password","$db") or die (mysql_error());
    
    $result1 = mysqli_query($cons,"select count(*) count from $table");
    $r1 = mysqli_fetch_array($result1);
    $count1 = (int)$r1['count'];
    mysqli_query($cons, '
    		LOAD DATA LOCAL INFILE "'.$file.'"
    			INTO TABLE '.$table.'
    			FIELDS TERMINATED by \';\'
    			LINES TERMINATED BY \'\n\'
    ')or die(mysql_error());
    
    
    $result2=mysqli_query($cons,"select count(*) count from $table");
    $r2=mysqli_fetch_array($result2);
    $count2=(int)$r2['count'];
    
    
    $count = $count2-$count1;
    if ($count>0) {
    	echo "Success";
    	echo "<b> total $count records have been added to the table $table </b> ";
    } else {
    	echo "Mysql Server address/Host name ,Username , Database name ,Table name , File name are the Mandatory Fields";
    }
    Il risultato � positivo, ma ho 2 problemi.

    1) alcuni campi mi risultano non incolonnati in modo corretto rispetto al file CSV e suppongo perch� in quest'ultimo 'possono essere anche vuoti'. Infatti le prime colonne si trovano tutte perch� sono campi che non possono essere vuote (tipo cognome, nome, codice fiscale, ecc). Comunque sia non so come risolvere;

    2) il file csv ha 62054 righe, il messaggio stampato a video mi dice che sono stati inseriti 56389 record, mentre in phpMyAdmin l'auto increment � arrivato a 54531

    Insomma di sicuro mi son perso qualche pezzo per strada.

  2. #2
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    408
    Ciao,
    puoi mettere un esempio della riga del file CSV completa ed una con i campi mancanti?

    1) In teoria dovrebbero esserci delle virgole ,, dove il campo non e' valorizzato e mariadb lo dovrebbe capire e lasciare il campo vuoto.

    2) possono esserci stati degli errori di conversione da CSV a DB, prova a importare direttamente con l'eseguibile di mariadb.exe attivando la visualizzazione degli errrori con un comando del genere

    mariadb.exe -u root --execute="use xml; load xml local infile './xml.xml' into table logs;" --show-warnings --default_character_set utf8

    in questo caso importavo un file xml nella tabella logs del DB xml
    Da un grande potere derivano grandi responsabilità

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    75
    Quote Originariamente inviata da abellos Visualizza il messaggio
    Ciao,
    puoi mettere un esempio della riga del file CSV completa ed una con i campi mancanti?

    1) In teoria dovrebbero esserci delle virgole ,, dove il campo non e' valorizzato e mariadb lo dovrebbe capire e lasciare il campo vuoto.

    2) possono esserci stati degli errori di conversione da CSV a DB, prova a importare direttamente con l'eseguibile di mariadb.exe attivando la visualizzazione degli errrori con un comando del genere

    mariadb.exe -u root --execute="use xml; load xml local infile './xml.xml' into table logs;" --show-warnings --default_character_set utf8

    in questo caso importavo un file xml nella tabella logs del DB xml
    Ti ringrazio, sono riuscito a risolvere, nonostante i diversi errori.

  4. #4
    Quote Originariamente inviata da jip77 Visualizza il messaggio
    Ti ringrazio, sono riuscito a risolvere, nonostante i diversi errori.
    spiega come, please, a beneficio anche di altri utenti

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    75
    Quote Originariamente inviata da optime Visualizza il messaggio
    spiega come, please, a beneficio anche di altri utenti
    Hai ragione, ma sono alle prime armi ed in realtà poi quel codice trovato proprio all'inizio, non l'ho più usato (adattato). Ho visto che usare PHP PDO è un pochino meglio se si vuole cambiare tipo di database (potrebbe capitare nel mio caso). Per leggere i file csv ed inserirli nel database utilizzo questo codice:

    codice:
    // inserimento dati        try {
                $data = [];                                                                        
                                                                                            
                $file = fopen($cartella_report_ADV.$nome_file_new, "r");
                $rigo = 1;
                while (($column = fgetcsv($file, 100000, ";")) !== FALSE) {
                    
                    if ($rigo > 1) {
                        
                        $operatore = strtoupper($column[0]);
                        $utente_cn = $column[1];
                        $utente_nm = $column[2];
                        
                        $data[] = [$operatore, $utente_cn, $utente_nm];
    
    
                    }
    
    
                    $rigo ++;
    
    
                }
                
                $sql_insert = 'INSERT INTO tbl_accessi (operatore, utente_cn, utente_nm) VALUES (?, ?, ?)';
                $stmt = $connection->prepare($sql_insert);
                
                foreach ($data as $row) {
                    $stmt->execute($row);
                }
                
                $connection->commit();
    
    
                print_r("<b>"."OK: dati inseriti"."</b>");
                
                    
            } catch (PDOException $e) {
                print_r ("<b>"."ERRORE: problema nell'inserimento dei dati -  ".$e->getMessage()."</b>");
                die();
            }

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.