Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 31

Discussione: SQlite e csv

  1. #1
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito SQlite e csv

    Un saluto a tutti !
    qualcuno mi può dire come estrarre i dati da database SQlite in formato csv con php 7

    Ho provato cosi:

    exec(' sqlite3 -header -csv 'test.db' "select * from table1;" > 'data.csv' ');

    ma non funziona
    Mille grazie in anticipo.

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Non funziona perché le exec non sono utilizzabili su AlterVista (e, in generale, negli hosting condivisi). Ance se lo fossero, quel codice non sarebbe portabile in quanto non puoi assumere che un client sqlite3 sia disponibile.

    Devi leggere la tabella SQLite, ad esempio come mostrato in Export sqlite table using php, e poi esportare in CSV, ad esempio con fputcsv.

    I suggerimenti che do più spesso:


  3. #3
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Molte grazie per la risposta, poi scusami sono un alle prime armi, e leggo che la funzione

    fputcsv() scrive in un file CSV i dati di un array

    a me serve convertire i dati di una tabella sqlite.db in formato csv

    e da qualche parte ho letto che si poteva fare con ;

    sqlite3 -header - csv 'test.db' "select * from table;" > data.csv

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    e da qualche parte ho letto che si poteva fare con ;

    sqlite3 -header - csv 'test.db' "select * from table;" > data.csv
    ...che come tu stesso hai visto non funziona per i motivi sopra citati
    Funzionerebbe egregiamente se tu lavorassi da linea di comando, ma non è così.

    fputcsv() scrive in un file CSV i dati di un array
    Esatto, e...

    a me serve convertire i dati di una tabella sqlite.db in formato csv
    ... puoi semplicemente mettere insieme le due cose: leggi i dati dalla tabella sqlite.db, riga per riga, e li memorizzi temporaneamente in un vettore, quindi usi fputcsv per scrivere quel vettore in un file CSV.

    I suggerimenti che do più spesso:


  5. #5
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Buongiorno mzanella,
    sei stato davvero gentilissimo.
    Molte grazie per il suggerimento.
    Ti auguro un buon inizio settimana.

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Prego !
    Poi se hai dubbi specifici riguardo al codice da scrivere, non farti scrupoli a chiedere.

    I suggerimenti che do più spesso:


  7. #7
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Buonasera mzarella, ti ringrazio per la disponibilità, della quale non avrei voluto approfittare.
    Ho seguito i tuoi consigli, quindi ho letto il manuale e una miriade di esempi, che ho provato a mettere in pratica, ma la maggior parte erano riferiti a versioni precedenti di sqlite.
    Sono però riuscito finalmente a leggere una tabella del database, e anche ad inserire dei dati in un vettore e da questo avere un file.csv con la funzione fputcsv da te suggerita.
    Ma non riesco a mettere insieme le due cose.
    Se per te va bene ti mostrerei i due codici.

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Certo, riporta pure i codici e vediamo il da farsi :)

  9. #9
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Buongiorno ! ecco di seguito i codici :

    selezionatab.php

    <?php
    class MyDB extends SQLite3 {
    function __construct() {
    $this->open('test.db');
    }
    }

    $db = new MyDB();
    if(!$db) {
    echo $db->lastErrorMsg();
    } else {
    echo "Apertura database con successo\n";
    }

    $sql =<<<EOF
    SELECT * from COMPANY;
    EOF;

    $ret = $db->query($sql);
    while($row = $ret->fetchArray(SQLITE3_ASSOC) ) {
    echo "ID = ". $row['ID'] . "\n";
    echo "NOME = ". $row['NOME'] ."\n";
    echo "INDIRIZZO = ". $row['INDIRIZZO'] ."\n";
    echo "TELEFONO = ". $row['TELEFONO'] ."\n";
    echo "EMAIL = ". $row['EMAIL'] ."\n";
    echo "USER = ".$row['USER'] ."\n\n";
    }
    echo "Operazione conclusa con successo\n";
    $db->close();
    ?>


    creacsv.php

    <?
    $list = array (
    array('ID', 'NOME', 'COGNOME', 'INDIRIZZO'),
    array('TELEFONO', 'EMAIL', 'USER')
    );
    $file = fopen('file.csv', 'w');
    foreach ($list as $fields) {
    fputcsv($file, $fields);
    }
    fclose($file);

    ?>

  10. #10
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Ok, cominciamo dalla scrittura del CSV. UN CSV ha una struttura di questo tipo:
    Codice:
    valore_1_1,valore_1_2,valore_1_3,...,valore_1_N
    valore_2_1,valore_2_2,valore_2_3,...,valore_2_N
    ...
    valore_M_1,valore_M_2,valore_M_3,...,valore_M_N
    che rappresenta un insieme di M elementi, ciascuno con N attributi. Ogni elemento, immaginato atomico, occupa una singola riga.
    Una struttura alternativa per rappresentare un singolo elemento è il vettore, in cui ciascuna componente contiene il valore di un attributo. In pseudocodice:
    Codice:
    [valore_1_1, valore_1_2, valore_1_3, ..., valore_1_N]
    Quest'ultima rappresentazione è utile per ragionare con fputcsv: il codice per esportare un singolo elemento in formato CSV è quindi
    Codice PHP:
    $file = fopen('file.csv', 'w');
    ...
    $row = ... // Per esempio $row = array(5, 'Mario', 'Rossi', 'via Corso 1', '0000 - 123456', 'mail@mail.it', 'user');
    fputcsv($file, $row);
    ...
    fclose($file);
    Attento che, nel tuo codice, stai facendo una cosa piuttosto strana:
    Codice:
    $list = array (
        array('ID', 'NOME', 'COGNOME', 'INDIRIZZO'),
        array('TELEFONO', 'EMAIL', 'USER')
    );
    ovvero stai mettendo alcuni attributi di un singolo elemento (ID, NOME, COGNOME, INDIRIZZO) in una riga, gli altri (TELEFONO, EMAIL, USER) in un'altra riga. Il "CSV" risultante sarebbe quindi:
    Codice:
    ID,NOME,COGNOME,INDIRIZZO
    TELEFONO,EMAIL,USER
    il che non è quello che vuoi (credo).

    Il tutto sta nell'ottenere il vettore con le componenti dell'elemento da esportare. Ma questo ce l'hai già in:
    Codice PHP:
    ...
    while(
    $row = $ret->fetchArray(SQLITE3_ASSOC)) {

    }
    ...
    La variabile $row è già pronta all'uso . Mettendo -letteralmente- insieme i due codici risulta:
    Codice PHP:
    ...
    $fd = fopen('file.csv', 'w');
    $result = $db->query($sql);
    while (
    $row = $result->fetchArray(SQLITE3_ASSOC)) {
    fputcsv($fd, $fields);
    }
    fclose($fd);

    echo
    "Operazione conclusa con successo\n";
    ...
    E questo è sufficiente a far funzionare il meccanismo. Di seguito qualche indicazione su come migliorare alcune cose:
    • non estendere classi come SQLite3, usa piuttosto la composizione...
    • ...azione comunque inutile in questo contesto, in quanto non hai bisogno di wrapper, adapter, decorator o simili: usa direttamente un oggetto della classe SQLite3
    • usa nomi evocativi per gli identificatori, per esempio SQL è universalmente noto come acronimo di STRUCTURED QUERY LANGUAGE, dunque se chiami una variabile $sql uno si aspetta che quella variabile contenga un intero linguaggio, mentre tu la stai usando per definire una query: chiamala dunque $query; lo stesso per $ret, che immagino stia per returned value: molto più semplice chiamarla $result;
    • non usare heredoc se non è necessario, la variabile $sql può essere inizializzata semplicemente come
      Codice PHP:
      $sql = "SELECT * from COMPANY;"


    Mettendo tutto insieme, ottieni:
    Codice PHP:
    $db = new SQLite3('test.db');
    if (!
    $db) {
    echo
    $db->lastErrorMsg();
    }
    else {
    echo
    "Apertura del database avvenuta con successo.\n";
    }


    $query = "SELECT * FROM COMPANY;";
    $result = $db->query($query);
    $file_handle = fopen('file.csv', 'w');
    while (
    $row = $result->fetchArray(SQLITE3_ASSOC)) {
    fputcsv($file_handle, $row);
    }
    fclose($file_handle);
    $db->close();

    echo
    "Operazione conclusa con successo\n";

    I suggerimenti che do più spesso:


  11. #11
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Wow Grazie ci provo e ti faccio sapere. Mille Grazie
    Ultima modifica di aessido : 28-05-2019 alle ore 11.43.35

  12. #12
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Funziona Perfettamente !
    Ultima modifica di aessido : 28-05-2019 alle ore 12.14.32

  13. #13
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Qualcosa è andato storto nella query. Capita! Vediamo cosa aggiungendo un if... dopo l'interrogazione:
    Codice PHP:
    ...
    $result = $db->query($query);
    if (
    $result === false) {
    echo
    "Errore nell'interrogazione: " . $db->lastErrorMsg() . "\n";
    }
    ...

    I suggerimenti che do più spesso:


  14. #14
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Scusami avevo commesso un banale errore.

    Non so proprio come ringraziarti !


    Forse ti può interessare sapere a cosa mi serve tutto questo ?
    Ultima modifica di aessido : 28-05-2019 alle ore 12.33.24

  15. #15
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Forse ti può interessare sapere a cosa mi serve tutto questo ?
    Se vuoi raccontarlo, perché no?
    Immagino potrebbe trattarsi di uno strumento per esportare dei dati che già possiedi in una base di dati SQLite in un formato che sia gestibile da programmi con cui vuoi elaborare quei dati, per esempio excel...

    I suggerimenti che do più spesso:


  16. #16
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Conosci Telegram, l'app di messaggistica ?
    Attraverso questa ho creato diversi BOT, che si appoggiano ad Altervista, tra cui l'ultimo, che tra le sue funzioni ha quella di georiferire su Umap (applicazione di OpenStreetMap), i dati (testo, foto) che inviano gli utenti (registrati) del BOT. Quindi come risultato si avrà una mappa con tanti punti geolocalizzati che riguardano l'argomento indicato nelle premesse del BOT stesso (ad esempio potrebbe servire per segnalare episodi di degrado urbano).

  17. #17
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Per Umap occorrono i dati in formato ad esso compatibile, tra cui il csv. Quindi tutti gli invii, vengono registrati nel data.sqlite e poi mi serviva poter estrarli in csv.
    Su non server non free l'istruzione di cui all'inizio della nostra chiacchierata avrebbe funzionato perchè indicata da chi l'ha usata. Qui grazie alla tua disponibilità !

  18. #18
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Capito, è un bel progetto, complimenti !

    I suggerimenti che do più spesso:


  19. #19
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Grazie, infatti ci sto lavorando da un bel pò. Attualmente, anche come prova, insieme ad amici(utenti del BOT) abbiamo distribuito per il quartiere e poi geolocalizzato alcuni dispenser gratis di bustine raccolta feci di cane.
    Oltre a darne notizia il BOT servirà anche a monitorare(es. necessità rifornimento o scomparsa)

  20. #20
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Spero di non approfittare troppo nel chiederti ancora un aiuto per creare di quel codice una

    sqlite_create_function() in modo da poterla richiamare ogni volta che mi serve.
    Ultima modifica di aessido : 28-05-2019 alle ore 14.36.13

  21. #21
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Non ricordo se su AlterVista le SQLite function siano utilizzabili... mi sembra che non lo siano per MySQL, ma per SQLite non lo so.

    In ogni caso puoi semplicemente creare una funzione PHP, qualcosa come:
    Codice PHP:
    function sqlite_to_csv($sqlite_file, $csv_file) {
    ...
    }
    con all'interno il codice visto in precedenza.

    I suggerimenti che do più spesso:


  22. #22
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Buonasera,
    Proverò domani e poi ti farò sapere. In ogni caso ti ringrazio molto !

  23. #23
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Buongiorno mzanella,
    sono qui per ringraziarti ancora, e per farti sapere che da qualche giorno sto testando il progetto con esito positivo.

  24. #24
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Prego, figurati . Mi fa molto piacere sapere che lo sviluppo sta procedendo bene!

    I suggerimenti che do più spesso:


  25. #25
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Si sono molto soddisfatto. Grazie !

  26. #26
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Un 'ultima cosa, è possibile far scrivere nel file csv anche il nome dei campi ?

  27. #27
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Certo, basta che prima di iniziare a scrivere i valori nelle righe tu inserisca una riga contenente i nomi delle colonne. Qualcosa come:
    Codice PHP:
    $file_handle = fopen('file.csv', 'w');
    fputcsv($file_handle, array("Nome colonna 1", "Nome colonna 2", "Nome colonna 3"));
    while (
    $row = $result->fetchArray(SQLITE3_ASSOC)) {
    fputcsv($file_handle, $row);
    }
    Questo funziona meglio quando le colonne sono fissate a priori. Se vuoi renderlo del tuo generico puoi leggere i nomi delle colonne direttamente dal risultato della query.

    I suggerimenti che do più spesso:


  28. #28
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Grazie maestro ! ... metterò subito in pratica !

  29. #29
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Questo mi permetterà di localizzare i punti su mappa in tempi molto più brevi !
    Ti farò sapere. Grazie e buon proseguimento di giornata !

  30. #30
    aessido non è connesso Neofita
    Data registrazione
    24-08-2016
    Messaggi
    19

    Predefinito

    Buongiorno mzanella !
    Scusa il ritardo, tutto funziona perfettamente.
    Ancora mille grazie !

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •