• Super User

    LOAD DATA INFILE e doppi apici

    Con la funzione LOAD DATA INFILE lanciata da PHP sono riuscito a copiare velocemente il contenuto di un csv nel DB.
    Il problema è che tutti i campi vengono copiati con i doppi apici, c'è un modo per evitarlo? Grazie


  • User Attivo

    Come hai strutturato la query sql?

    Struttura tipica:

    
    LOAD DATA INFILE 'file.csv'
    INTO TABLE tabella
    FIELDS
        TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '"'
    LINES
        TERMINATED BY '\r\n'
    
    

    Ciao :ciauz:


  • Super User
    LOAD DATA INFILE '".$file."' IGNORE INTO TABLE $tabella FIELDS TERMINATED BY ';'  LINES TERMINATED BY '\\n' IGNORE 1 LINES
    

    Mi consigli di aggiungere \r in LINES TERMINATED?


  • User Attivo

    Nel linguaggio C o C++ utilizzare "\n" oppure "\r\n" non cambia, più che altro è una forzatura per evitare problemi.
    \r che significa "carriage return", obbliga a tornare all'inizio della linea, mentre \n che significa "newline", indica l'andata a capo.
    Quindi con "\r\n" si obbliga al parser a leggere la successiva nuova linea dal carattere iniziale.
    In base all'editor di testo ed il SO utilizzato, "\n" si comporta in modo diverso, quindi conviene utilizzare "\r\n".
    Infine bisogna stare attenti alla codifica con cui viene salvato il file, sempre meglio utilizzare quelle standard come ANSI.


  • User Attivo

    Potresti postare anche un esempio di come hai strutturato il file CSV


  • Super User

    Non si tratta di un file specifico, ma devo riuscire a "digerire" la qualunque.
    Cmq il mio problema è eliminare i doppi apici in fase di acquisizione, quindi "valore" dovrebbe essere memorizzato come valore (senza apici, appunto).


  • User Attivo

    Ho fatto dei test, non mi da' problemi di virgolette.
    Non è per caso che i campi della tabelle siano incompatibili con il flusso dati generato dalla query e, per risolvere le divergenze, vengano inserite le virgolette ad ogni valore, una sorta di conversione, esempio per trasformare un valore testo in stringa.

    Se vuoi posta la query che hai utilizzato per strutturare la tabella.
    Nei test, ho utilizzato solo campi di tipo VARCHAR.

    Ciao :ciauz:


  • Super User

    Appena risolto 🙂

    Dovevo aggiungere

    ENCLOSED BY '\"'
    ```Lo avevo aggiunto già prima ma sicuramente avevo fatto casini con backslash :x e non funzionava.
    
    Grazie a tutti per la collaborazione :ciauz:
    
    EDIT: Consiglio a tutti di utilizzare questa funzione di MySQL per caricare i csv nel DB, è molto più veloce che parserizzare il file in PHP e poi effettuare l'inserimento (pochi secondi anche per file di 14 mb).