Importare txt, dividerlo e salvarlo in più txt

di il
5 risposte

Importare txt, dividerlo e salvarlo in più txt

Buongiorno a tutti...devo importare in matlab un file txt contenente una colonna e mooolte righe, vi sono righe con numeri negativi a cui si alternano righe con testo e caratteri speciali (/ = ).
Dato che il file txt contiene milioni di righe io vorrei dividerlo in vari file e salvare ciascuno di essi.
Ho impostato il seguente codice:
A=importdata('miofile.txt');
B-=A(1:10000);
save B -ascii

tuttavia non ottengo quello che cerco...qualcuno sa darmi suggerimenti o indicarmi altre procedure ??

grazie!!!

loretta

5 Risposte

  • Re: Importare txt, dividerlo e salvarlo in più txt

    Potresti pubblicare qualche riga significativa del file?
    Le righe che contengono "testo", hanno degli spazi bianchi tra i vari caratteri / stringhe?
    Con quale "logica" vuoi dividere il file? Un file con solo numeri, uno con solo caratteri, ...? 10000 righe per ogni file, ...?

    Rispetto al codice che hai pubblicato:
    cosa intendevi ottenere con
    B-=A(1:10000);
    in particolare con "B-="?
  • Re: Importare txt, dividerlo e salvarlo in più txt

    Il file contiene righe del tipo:

    "....
    PS=220,1422,STA1,0,2,0,1,120,120,0,0
    C=34755
    T=09/04/2015 10:08:49.000 9
    U=3.31,4.81,12.38,23.75
    L=-9668
    L=-9665
    L=-9664
    L=-9672
    L=-9663
    L=-9658
    ....."

    si susseguono righe con caratteri e numeri, in realtà "L=" non mi interessa...quindi si potrebbe anche eliminare...(se solo ci riuscissi..)
    si tratta di una sequenza di registrazione di segnale, quindi vi è la riga con la data (T=09/04/2015 10:08:49.000 9), poi vi sono parametri di settaggio dello strumento e poi si susseguono le misure L= -9668 ecc...
    Io intendevo importare il file txt e dividerlo in più parti...se possibile in base alla data e poi salvare ogni parte come txt...quindi in ratica dividere il file txt iniziale in tanti txt ...
    non sono esperta di matlab e ho una conoscenza basilare (non lo usa da anni...)

    grazie per ogni suggerimento
  • Re: Importare txt, dividerlo e salvarlo in più txt

    Non credo che MatLab sia il linguaggio più indicato per manipolare files di testo, soprattutto se sono molto grandi e se le varie righe hanno formati / contenuti differenti.

    Personalmente risolverei il problema usando, ad esempio, AWK: hai accesso a Linux?

    Ad ogni modo, devi essere più precisa nella definizione del formato e dell'output desiderato:
    - al fondo della riga con la data c'è un 9: ha un significato particolare? Fa parte della data? Vuoi "caricare" anche quel valore?
    - vuoi poter caricare in MatLab anche i parametri di settaggio?
    - le due righe

    PS=220,1422,STA1,0,2,0,1,120,120,0,0
    C=34755

    si trovano, in realtà all'interno del blocco dati che comincia con la data?

    - vuoi caricare anche questi parametri in MatLAb? Se sì, come pensi di gestire "STA1" nella riga "PS=..."?
    - le righe con "L=..." sono le ultime prima di una nuova sezione che cominci con la data?
  • Re: Importare txt, dividerlo e salvarlo in più txt

    Fermi restando i dubbi sull'opportunità di usare MatLab per processare dei files di testo molto grossi, un possibile approccio potrebbe essere:

    - leggere il file di input una riga alla volta (con la funzione "fgetl")
    - usare la funzione "strtok" per identificare la lettera / le lettere che precedono il segno "="
    - in base alla lettera individuata:
    - nel caro sia "T"
    - viene creato il nome del file di output in base alla data definita dopo il segno "=" (con la funzione "datevec")
    - negli altri casi, scrivere direttamente la riga nel file di output

    Per poter importare facilmente ii vari files di testo così generati, sembra utile:

    - definire il file di output come un file MatLab (estensione ".m")
    - scrivere in esso le varie righe in formato "array"

    Questo consente di caricare il file nel Workspace semplicemente "lanciando" il file stesso.

    Non avendo ricevuto risposa alle ultime domande relative al formato ed al contenuto del file di input, sulla base dell'esempio fornito, se il contenuto / formato del file di input è il seguente
    T=09/04/2015 10:08:49.000 9
    U=3.31,4.81,12.38,23.75
    PS=220,1422,STA1,0,2,0,1,120,120,0,0
    C=34755
    L=-9668
    L=-9665
    L=-9664
    L=-9672
    L=-9663
    L=-9658
    T=19/03/2015 10:08:49.000 9
    U=3.31,4.81,12.38,23.75
    PS=220,1422,STA1,0,2,0,1,120,120,0,0
    C=12345
    L=-43643
    L=-7536
    L=-5236
    L=-8536
    L=-3656
    L=-3464
    questo codice
    % Apertura del file di input
    fp_in=fopen('x.txt','rt')
    % Lettura del file di input, riga per riga
    while 1
       tline = fgetl(fp_in);
       % Se è stata raggiunta la fine del file di input
       if ~ischar(tline)
          % Stampa nel file di output della "]" che chiude il vettore dati "L"
          fprintf(fp_out,'];\n')
          % Si forza l'uscita dal loop di letura del file di input
          break
       end
       % Scomposizione della i-esima riga in base al swgno "="
       [token, remain]=strtok(tline,'=');
       % A seconda di cosa precede il segno "=" ...
       switch(token)
          % "T" identifica una nuova sezione ==> un nuovo file di output
          case 'T'
             % Controllo per la chiusura del precedente file di output
             if(exist('fp_out'))
                % Stampa nel file di output della "]" che chiude il vettore
                % dati "L"
                fprintf(fp_out,'];\n')
                % Chiusura del file di output
                fclose(fp_out)
             end
             % Settaggio del flag usato per scrivere una volta sola "L=[" nel
             % file di output
             L_flg=1;
             % Eliminazione del segno "=" dalla seconda parte della i-esima
             % riga in input
             remain(1)=[];
             % Eliminazione del "9" al fondo della riga (ammessoche non serva)
             remain(end)=[];
             % Creazione del nome dello i-esimo file di output in base alla
             % data
             new_file=['file_' strrep(num2str(datevec(remain,'dd/mm/yyyy HH:MM:SS.FFF')),' ','_') '.m']
             % Apertura del file di output
             fp_out=fopen(new_file,'wt')
          case 'U'
             % Se la riga contiene "U=...", la riga viene scritta in forma di
             % vettore nel file di output
             fprintf(fp_out,'U=[%s];\n',remain(2:end))
          case 'L'
             % Se la riga contiene "L=...", la prima volta la viene scritto nel
             % file di output "L=[" seguito dal numero
             if(L_flg)
                L_flg=0;
                fprintf(fp_out,'L=[%f\n',str2num(remain(2:end)))
             else
                % Per le occorrenze successive, viene scritto solo il valore.
                % La "]" viene chiusa al termine della lettura della i-esima
                % sezione del file di input (vedi sopra)
                fprintf(fp_out,'%f\n',str2num(remain(2:end)))
             end
          case 'C'
             % Se la riga contiene "C=...", la riga viene scritta in forma di
             % vettore nel file di output
             fprintf(fp_out,'C=[%s];\n',remain(2:end))
          case 'PS'
             % Se la riga contiene "PS=...", la riga viene scritta tale e quale
             % e "commentata". Bisogna definire come trattare la stringa "STA1"
             c='%';
             fprintf(fp_out,'%c %s\n',c,tline)
             disp('PS')
          otherwise
             disp('unknown')
       end
             
    end
    fclose(fp_in);
    
    genera questi due files ".mat"

    file_2015_____3____19____10_____8____49.m
    U=[3.31,4.81,12.38,23.75];
    % PS=220,1422,STA1,0,2,0,1,120,120,0,0
    C=[12345];
    L=[-43643.000000
    -7536.000000
    -5236.000000
    -8536.000000
    -3656.000000
    -3464.000000
    ];
    
    file_2015_____4_____9____10_____8____49.m
    U=[3.31,4.81,12.38,23.75];
    % PS=220,1422,STA1,0,2,0,1,120,120,0,0
    C=[34755];
    L=[-9668.000000
    -9665.000000
    -9664.000000
    -9672.000000
    -9663.000000
    -9658.000000
    ];
    
    Il codice è facilmente aggiornabile per trattare altre "lettere" che precedano il segno "=" (DISCLAIMER: IL CODICE E' FORNITO "AS IS" ED E' STATO SVILUPPATO IN BASE AD IN FORMAZIONI INCOMPLETE SUL FORMATO / CONTENUTO DEL FILE DI INPUT - NON SO GARANTISCE LA SUA VALIDITA PER INOUT DIVERSI DA QUELLO SOPRA RIPORTATO COME ESEMPIO.

    Un paio di consigli nel caso di modifiche al codice:

    fai sempre una copia dei files di input prima di utilizzare il codice
    nel definire gli handle dei files di input e outpout (le variabili ritornate dalle chiamate alle funzioni "fopen" USA SEMPRE VARIABILI CON NOMI MOLTO DIFFERENTI
  • Re: Importare txt, dividerlo e salvarlo in più txt

    Grazie mille per il tuo aiuto..
    ho provato ed in effetti gestire file così grandi diventa un pò scomodo in matlab..
    Ho cercato di semplificare le cose ...dunque quello che vorrei ottenere è:

    -analizzare riga per riga il file di partenza(txt) e considerare solo le righe che iniziano per "T=" (ovvero le date) e con "L=" (ovvero i valori misurati). Quindi tutte le altre righe non servono...si possono ignorare o cancellare.. Questo dovrebbe semplificare la mole di dati..(spero).

    -il passo successivo è ottenere per ogni "T="(quindi per ogni data) la media di vari valori scriti dopo ogni "L=".

    Mi spiego meglio...vorrei ottenere un file (txt) di questo tipo:

    data (scritta dopo "T=" ) | media dei sucessivi valori scritti dopo "L="
    09/04/2015 10:08:49.000 | media (-9668,-9665,-9664,-9672,-9663,-9658) = -9665
    19/03/2015 10:08:49.000 | media (-43643,-7536,-5236,-8536,-3656,ecc )
    ecc.. | ecc...

    credo che in questo modo sia più semplice da gestire in matlab e la procedura dovrebbe impiegare anche meno tempo..

    grazie per aiuti e suggerimenti..
Devi accedere o registrarti per scrivere nel forum
5 risposte