Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2021
    Messaggi
    4

    Importare file CSV. Problema con importazione di numeri all'interno del file pari o superiori a 1.000,00

    Ciao a tutti, premetto di essere un principiante quindi scusate se scrivo qualche assurdità..
    Ho un piccolo problema con l'importazione di un file CSV in MySQL tramite php, il file è così composto;

    KERT;Stabilizzatore 180-270V 5,5 KVA;Art. con magazzino;ACCESSORI;ALIMENTATORI;pz;22; 1.400,00;;;;;;;;;;;;;;; 905,63;;;0;0;;1;1;0;0;0;0;0,49;28/12/2021;28/12/2021;28/10/2021;28/10/2021;16/11/2021; 905,63; 905,63; 1.400,00;Esaurito;

    questa è una riga del csv.
    Il codice per l'importazione è il seguente

    Codice PHP:
    public function import() {

            
    $fieldseparator ";";
            
    $lineseparator "\n";
            
    $lines 0;
            
    $linearray = array();

            
    $csv_file $_FILES['fileToUpload']['tmp_name'];
            
    $csvcontent fread($file,$size);
            
    fclose($file);
            
    $stmt $this->db->prepare("TRUNCATE TABLE tab_prodotti");
            
    $stmt->execute();

            foreach(
    explode($lineseparator,$csvcontent) as $line) {            
                
    $lines++;
                if(
    $lines>1) {                
                    
                    
    // PULISCO LE SINGOLE RIGHE
                    
    $line trim($line," \t");
                    
    $line str_replace("\r","",$line);
                    
    $line str_replace("'","\'",$line);
                    
    $line str_replace('"',"",$line);
                    
    $line str_replace(",""."$line);
                    
                    
    // FILTRO DEI NUMERI TOGLIENDO IL PUNTO E SOSTITUENDO LA VIRGOLA CON IL PUNTO 
                    
    $linenumber str_replace("."""$line);
                    
    $linenumber str_replace(",""."$line);
                    
    $linenumbers explode($fieldseparator,$linenumber);
                    
                    
    //EXPLODE DELLA STRINGA
                    
    $linearray explode($fieldseparator,$line);
                    
    $linemysql implode("','",$linearray);
                 
                    
    $codice trim($linecodice[0]);
                    
    $descrizione trim($linearray[1]);
                    
    $um trim($linearray[5]);
                    
    $listino_1 trim($linenumbers[7]);
                    
    $prezzo_fornitore trim($linenumbers[22]);
                                         
                    if(
    $codice!="" && $descrizione!="") {
                        
    $stmt $this->db->prepare("INSERT INTO tab_prodotti (codice, descrizione, um, listino_1, prezzo_fornitore) VALUES (?, ?, ?, ?, ?)");
                        
    $stmt->bind_param('sssdd'$codice$descrizione$um$listino_1$prezzo_fornitore);
                        
    $stmt->execute();
                    } 
    funziona tutto perfettamente, ad eccezione del fatto che se trova un importo superiore a 999,99 dovrebbe rimuovere il punto e trasformare la virgola in un punto, ma non lo fa. Quindi mi trasforma 1.400,00 in 1.40.
    Spero che qualcuno possa aiutarmi a capire cosa sbaglio. grazie!

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Hai questo nella sezione "PULISCO LE SINGOLE RIGHE"
    $line = str_replace(",", ".", $line);

    e poi nella "FILTRO DEI NUMERI ..."
    $linenumber = str_replace(".", "", $line);
    $linenumber = str_replace(",", ".", $line);

    In due posti stai sostituendo il carattere , col . (è sempre su $line che intervieni)
    non lo fai usando un if/else hai solo messo dei commenti, quindi vengono eseguiti entrambi, di conseguenza se ad esempio in $line ci fosse 1.400,00:
    viene eseguito il primo
    $line = str_replace(",", ".", $line);

    ora vale 1.400.00

    viene eseguito
    $linenumber = str_replace(".", "", $line);
    il numero diventa
    1,40000
    e lo salvi in $linenumber

    si esegue
    $linenumber = str_replace(",", ".", $line);
    il numero ora è...
    1.400.00
    perché non stai modificando $linenumber, ma $line, quindi la sostituzione avviene sull'originale 1.400,00

    e 1.400.00 è equivalente a 1.4 (lo zero ti verrà per la precisione a 2 decimali nel db probabilmente) dato che la parte ".00" non ha senso, un numero può avere un solo separatore per i decimali e ci si ferma al primo.

    Devi cambiare la logica della pulizia del csv, così non ne esci, almeno non in modo semplice.
    Non devi pulire la riga intera, ma ogni cella secondo le regole del valore in essa contenuto (stringa, numero, data...)
    Ultima modifica di Alhazred; 30-01-2022 a 11:23

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    191
    Mysql non ha il specificatore formato della valuta (money_format deprecato da php 7.4 si).
    La variabile è di tipo stringa nel tuo file csv, nel database dovrà essere memorizzata stringa altrimenti se presente la virgola dopo il punto decimale la tronchi o arrotondi "con perdita", ergo poi memorizzi in DECIMAL(6,2) mysql.
    Ultima modifica di darbula; 30-01-2022 a 12:39

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2021
    Messaggi
    4
    Ti ringrazio Alhazred, non avevo capito che in fondo stavo agendo sempre su $line. La tua spiegazione chiara mi ha aiutato, ho risolto.

    Grazie mille!
    Ultima modifica di AlessM; 30-01-2022 a 15:44

Tag per questa discussione

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.