Visualizzazione dei risultati da 1 a 10 su 10

Discussione: lettura file

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    4

    lettura file

    Salve
    sono nuovo nel forum e questo è il mio primo post.
    Ho bisogno di un consiglio...
    Devo estrarre dei dati da un file .txt ed inserirli all'interno di un database MySQL.

    Il file è nel seguente formato:
    AN Aixovall
    AN Aixirivall
    AN Aixas
    AN La Margineda
    AN Incles
    AN Bordes d'Envalira
    AN Sant Miquel d'Engolasters
    AE Suhaylah
    AE Zuwayhir
    AE Zubarah
    AE Zikt

    Le sigle sulla sinistra indicano le nazioni mentre sulla destra ci sono nomi di città ho bisogno di recuperlarle entrambe, non essondoci punteggiatura non so come far capire al programma quando inizia una nuova riga e quindi trattare una nuova città.

    Se sapete come realizzarlo in PHP meglio ma se volete potete anche consigliarmi un altro linguaggio.

  2. #2
    Il file non lo puoi modificare in alcun modo?
    Così su due piedi mi viene da dire che potresti leggere tutto , splittare gli spazi , salvare le stringhe in una lista e poi prendere i risultati a due a due, dove inogni coppia il primo è sempre la nazione ed il secondo il nome di città?

    EDIT No non puoi farlo perchè ho visto che ci sono nomi di cittá composti da più di unaparola, e separati anch'essi da spazio. A questo punto l'unica cosa che posso dirti è che devi assolutamente riuscire a capire quando inizia una riga, a quel punto per i primi due caratteri prendi la nazione, il terzo lo salti, e da lì a fine riga salvi tutti i caratteri come nome di città

  3. #3
    Ciao,
    ma le informazioni sul file stanno su righe diverse? o sono soltano righe logiche?
    Se stanno su righe diverse ti basta leggere tutti i caratteri fino a '\n', il carattere di ritorno a capo.

    puoi fare (in c ad esempio)

    codice:
    FILE *f = fopen("tuoFile", "r");
    
    char righe[max_righe][massima_lunghezza];
    
    int riga, n_carattere;
    riga = n_carattere = 0;
    
    char c = -1; //inizializzazione al solo scopo di superare i primi controlli dei while
    
    while(c != EOF)
    {
      n_carattere = 0;
      while(c != '\n' && c != EOF)
      {
        fscanf(f, "%c", &c);
        righe[riga][n_carattere++]=c;
      }
      righe[riga][n_carattere-1] = '\0'; //sovrascrivo il carattere di return o di EOF col carattere di fine stringa
      riga++;
    }
    
    /*a questo punto nella matrice righe hai tutti i tuoi dati */
    Nell'esempio sopra (che non ho provato quindi potrebbe abbisognare di qualche ritocco), ho usato una dimensione statica della matrice, potresti volendo fare ogni vota un realloc ma potrebbe diventare un po' macchinoso e computazionalmente rilevante per file grandi.
    Se le dimensioni dei tuoi file sono grossomodo standard l'allocazione statica è da preferirsi.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    4
    Grazie della risposta
    Giusto non avevo pensato a \n.
    Per quanto riguarda il tipo di allocazione credo di doverla implementare in modo dinamico,
    il file è molto grande, sono più di 2 milioni di righe, non credo di poter usare una matrice per contenerli... o si ?
    Il file contiene la lista di tutte le città nel mondo, anche se a me servono solo quelle europee che dovrò estrarmi analizzando la sigla a inizio riga, penso che alla fine saranno almeno un 300 o 400mila.

    A questo punto chiederei anche se c'è qualcuno che sa quale è lo storage engine di MySQL che mi conviene utilizzare per una tabella così grande.

  5. #5
    La matrice la puoi fare grande quanto vuoi (limiti della memoria permettendo).
    Ovviamente se non hai almeno un'ordine di grandezza dei dati a priori, l'allocamento dinamico è consigliabile; anche se oneroso in termini di costo computazionale.
    Puoi usare un approccio ibrido, ovvero, un buffer di lunghezza fissa dimensionato sulla lunghezza massima della righa (che quinidi devi conoscere o stimare a priori), quindi durante la lettura conti i caratteri della riga e allochi un char* della dimensione appropriata e vi copi i caratteri contenuti nel buffer di cui sopra, quindi riallochi il char ** costituente la tua matrice per poter contenere la nuova "riga".

  6. #6
    Originariamente inviato da suciz
    Grazie della risposta
    Giusto non avevo pensato a \n.
    Per quanto riguarda il tipo di allocazione credo di doverla implementare in modo dinamico,
    il file è molto grande, sono più di 2 milioni di righe, non credo di poter usare una matrice per contenerli... o si ?
    Il file contiene la lista di tutte le città nel mondo, anche se a me servono solo quelle europee che dovrò estrarmi analizzando la sigla a inizio riga, penso che alla fine saranno almeno un 300 o 400mila.

    A questo punto chiederei anche se c'è qualcuno che sa quale è lo storage engine di MySQL che mi conviene utilizzare per una tabella così grande.
    Wow aai che mi servirebbe per una cosa che sto facendo? Sto file è proprietario o puoi distribuirlo? In caso sarei molto interessato e ti lascerei la mia email.

    Comunque tornando al problema: non avevo capito che potessi scriverlo in c(o simili) altrimenti ti avrei dato il codice, pensavo fossi obbligato a scriverlo in php del quale non ho alcuna idea del funzionamento.

    Magari allocare due milioni di righe non è un'ideona: dato che puoi contare le righe che leggi, io farei a prescindere una matrice di 100mila righe (per esempio, poi puoi provare diverse dimensioni. E vedere qual'è la soluzione migliore in termini di velocità/memoria, dipende molto dalla macchina sulla quale deve girare).
    Implementerei una cosa simile:
    -scegli un numero di righe fisso, che ora chiamiamo N, per esempio 100mila
    - leggi da file N righe e riempi la tua matrice
    -salvi righe_lette =N
    - salvi i dati in tabella
    - leggi le prossime N righe da file
    - righe_lette += N
    - aggiungi in database
    -....
    Così in loop fino alla fine del file.
    In questo modo poi puoi fare dei test e fare N grande abbastanza da non occupare tutta la memoria della tua macchina e contemporaneamente fare il minor numero di INSERT (che aumentano di parecchio i tempi).

    Facci sapere come decidi di andare avanti

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Roby.zip
    Ciao,
    ma le informazioni sul file stanno su righe diverse? o sono soltano righe logiche?
    Se stanno su righe diverse ti basta leggere tutti i caratteri fino a '\n', il carattere di ritorno a capo.

    puoi fare (in c ad esempio)

    ...
    è inutile ed error-prone scrivere tutto quel codice quando puoi fare lo stesso con una semplice funzione di libreria come la fgets() in maniera rapida, sicura, pulita ed efficiente.
    every day above ground is a good one

  8. #8

    Moderazione

    In PHP credo che si possa fare in maniera semplice - leggi la singola riga, fai uno split sul primo spazio e inserisci i dati in MySQL, tutte cose che in PHP sono relativamente facili; se mi confermi che vuoi scriverlo in PHP ti sposto nell'apposita sezione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    4

    Re: Moderazione

    Originariamente inviato da MItaly
    In PHP credo che si possa fare in maniera semplice - leggi la singola riga, fai uno split sul primo spazio e inserisci i dati in MySQL, tutte cose che in PHP sono relativamente facili; se mi confermi che vuoi scriverlo in PHP ti sposto nell'apposita sezione.
    Stavo provando a scriverlo in C ma in effetti preferirei usare PHP...
    Potresti postarmi anche il codice che useresti ?

    Originariamente inviato da MegaAlchimista
    Wow aai che mi servirebbe per una cosa che sto facendo? Sto file è proprietario o puoi distribuirlo? In caso sarei molto interessato e ti lascerei la mia email.
    Questo file l'ho trovato su geodatasource.com ed è liberamente scaricabile

  10. #10

    Re: Re: Moderazione

    Originariamente inviato da suciz
    Stavo provando a scriverlo in C ma in effetti preferirei usare PHP...
    Potresti postarmi anche il codice che useresti ?
    Non uso PHP quasi mai, per cui non ti saprei scrivere il codice così su due piedi, ma sono sicuro che per chi lo sa usare è una sciocchezza. Soprattutto, il C non mi pare il linguaggio adatto a questo genere di mestieri - io ad esempio userei Python, oppure sed per trasformare il file in questione in un CSV e importarlo usando tool standard.
    codice:
    matteo@teokubuntu:~$ xclip -o | sed 's/\ /,/'
    AN,Aixovall
    AN,Aixirivall
    AN,Aixas
    AN,La Margineda
    AN,Incles
    AN,Bordes d'Envalira
    AN,Sant Miquel d'Engolasters
    AE,Suhaylah
    AE,Zuwayhir
    AE,Zubarah
    AE,Zikt
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.