Importare file di testo .txt

di il
3 risposte

Importare file di testo .txt

Ciao. Devo importare un file di testo .txt in cui ci sono due colonne di numeri e solo una riga presenta dei caratteri. A me servono solo i numeri quindi dovrei eliminare la prima riga. Il problema è che facendo:

load dati.txt

mi dice che non posso importare il file.
Come posso fare per importare il file e poi eliminare la prima riga in modo da avere solo i numeri che mi interessano?
Grazie

3 Risposte

  • Re: Importare file di testo .txt

    Ci sono diversi modi per risolvere il problema.

    Il metodo più semplice consiste nell'utilizzare l'importazione guidata tramite la funzione "uiimport".

    Uno altro potrebbe consistere:

    [*] nel leggere il file di testo "riga per riga" con la funzione "fgetl"
    [*] "provare" a convertire direttamente la riga letta in numero con la funzione "str2num"
    [*] se la riga contiene solo numeri, la conversione va a buon fine ed i valori letti possono essere memorizzati in una matrice

    Un altro ancora potrebbe essere un po' più complicato e consiste nel generare, a partire dal file di testo originale, un altro file di testo all'interno del quale le righe di "testo" vengono precedute dal carattere "%".
    Questo nuovo file può quindi essere caricato nel workspace con la funzione "load" (in alternativa, si può decidere di non scrivere nel nuovo file le righe di testo, ma, in questo caso, si perderebbero delle informazioni, magari utili per identificare il contenuto del file stesso - al di là del suo nome).

    Si può quindi agire così:

    [*] come per il metodo precedente si legge il file di testo "riga per riga" con la funzione "fgetl"
    [*] si eliminano dalla riga letta gli "spazi bianchi"
    [*] si verifica la presenza di "numeri" nella stringa con la funzione "regexp"
    [*] se la stringa non contiene numeri o, se ne contiene, non sono in prima posizione alla riga originale del file viene aggiunto il carattere '%'. In caso contrario la riga viene scritta senza aggiunte

    Il secondo ed il terzo metodo sono stati implementati, rispettivamente, nei due script che seguono.
    Entrambi i metodi consentono di "scartare" un numero "qualunque" (non noto a priori) di "righe di testo".

    Primo metodo
    
    %
    % Apertura del file di testo
    %
    fp_orig=fopen('file_di_testo_char_num.txt','rt');
    % 
    % Inizializzazione matrice "vuota"
    % 
    M=[];
    %
    % Loop per la lettura del file di testo
    %
    while(1)
       %
       %    Lettura di una riga
       %
       tline=fgetl(fp_orig)
       %
       %    Identificazione della fine del file ed uscita dal loop di lettura
       %
       if ~ischar(tline)
          break
       end
    %    
    %    Conversione della stringa in numero (scalare o vettore)
    %    
       tmp=str2num(tline);
    %    
    %    Se la riga contiene solo numeri, la varaibile "tmp" conterrà i valori
    %    letti dal file i quali verranno assegnati alla matrice "M"
    % 
       if(~isempty(tmp))
          M=[M;tmp]
       end
    end
    % 
    % Chiusura dei file
    % 
    fclose(fp_orig);
    
    Secondo metodo - DISCLAIMER: LO SCRIPT APRE IN SCRITTURA UN FILE, UN CONTROLLO VIENE ESEGUITO PER VERIFICARE SE IL FILE ESISTA GIA, NEL CASO VIENE GENERATO UN MESSAGGIO DI ERRORE E LO SCRIPT VIENE INTERROTTO
    
    %
    % Apertura del file di testo
    %
    fp_orig=fopen('file_di_testo_char_num.txt','rt');
    %
    % Apertura IN SCRITTURA del file di testo modificato previa verifica del
    % fatto NON ESISTE. Nel caso, viene generato un messaggio di errore
    %
    nuovo_file='file_di_testo_char_num_MODIFICATO.txt'
    if(exist(nuovo_file,'file'))
       error('IMPOSSIBILE CREARE NUOVO FILE DI TESTO - FILE GIA ESISTENTE')
    end
    fp_modif=fopen(nuovo_file,'wt');
    %
    % Inizializzazione del carattere '%' usato per "commentare le righe di
    % testo da scartare
    %
    the_pc='%';
    %
    % Loop per la lettura del file di testo
    %
    while(1)
       %
       %    Lettura di una riga
       %
       tline=fgetl(fp_orig);
       %
       %    Identificazione della fine del file ed uscita dal loop di lettura
       %
       if ~ischar(tline)
          break
       end
       %
       %    Creazione di una stringa senza "spazi bianchi"
       %
       tmp_str=sscanf(tline,'%s');
       %
       %    Identificazione del contenuto della riga: \d ==> verifica se la stringa contiene un numero
       %
       tmp=regexp(tmp_str,'\d');
       %
       %    Se la stringa non contiene numeri o, se ne contiene, non sono in prima
       %    posizione alla riga originale del file viene aggiunto il carattere
       %    '%'. In caso contrario la riga viene scritta senza aggiunte
       %
       if(isempty(tmp) || tmp(1) ~= 1)
          fprintf(fp_modif,'%c%s\n',the_pc,tline);
       else
          fprintf(fp_modif,'%s\n',tline);
       end
    end
    %
    % Chiusura dei file
    %
    fclose(fp_orig);
    fclose(fp_modif);
    
    Hope this helps.
  • Re: Importare file di testo .txt

    Grazie! Un'altra cosa... è possibile fare la stessa operazione utilizzando la funzione textread ed iniziando a leggere il file dalla riga di interesse?
  • Re: Importare file di testo .txt

    Di principio è possibile usare la funzione "textread" tuttavia il suo utilizzo è sconsigliato dall'help di Matlab (come da estratto riportato di seguito)
    help textread
    textread Read formatted data from text file.
    A = textread('FILENAME')
    A = textread('FILENAME','',N)
    A = textread('FILENAME','',param,value, ...)
    A = textread('FILENAME','',N,param,value, ...) reads numeric data from
    the file FILENAME into a single variable. If the file contains any
    text data, an error is produced.

    [...]

    For files with empty cells, use the emptyvalue parameter. Suppose
    data.csv contains:
    1,2,3,4,,6
    7,8,9,,11,12

    Read the file like this, using NaN in empty cells:
    [data] = textread('data.csv','','delimiter',',','emptyvalue',NaN);

    textread is not recommended. Use TEXTSCAN instead.
    L'help di MatLab suggerisce di usare la funzione "textscan"

    Nei due esempi riportati di seguito la funzione textscan viene utilizzata in diverse modalità per leggere un file di test contenente 3 righe di "testo" da scartare seguite da "n" righe con due colonne di numeri come si seguito riprodotto:
    Prima riga con caratteri da scartare
    Seconda riga con caratteri da scartare
    Terza riga con caratteri da scartare
       8.1472369e-01   4.6171391e-02
       9.0579194e-01   9.7131781e-02
       1.2698682e-01   8.2345783e-01
       9.1337586e-01   6.9482862e-01
       6.3235925e-01   3.1709948e-01
    
    [*] Nel primo esempio vengono utilizzate due modalità di lettura distinte per l'utilizzo o meno della coppia di parametri 'headerlines',n (con "n" uguale al numero di righe da "scartare").
    L'uso del parametro "headrelines" semplifica la lettura del file, ma non rende disponibili nel workspace le righe scartate.
    Questo tipo di implementazione richiede che il numero delle righe da scartare sia noto a priori

    [*]Il secondo esempio costituisce un'estensione del primo (limitatamente al caso nel quale non viene utilizzato il parametro "headerlines").
    L'estensione consiste nel fatto che lo script non richiede che il numero di righe iniziali da scartare sia noto.

    Script 1
    % 
    % Definizione del numero di righe da scartare
    % 
    n_righe=3;
    % 
    % Selezione modalità di "scarto" delle righe
    %
    % skip_mode=1 ==> le righe vengono memorizzare in un cell array e sono
    %                  "disponibili" nel workspace per successivi eventuali
    %                  utilizzi
    % skip_mode=1 ==> le righe non vengono memorizzare non sono "disponibili"
    %                 nel workspace per successivi eventuali utilizzi
    % 
    skip_mode=2;
    %
    % Apertura del file di testo
    %
    fp_orig=fopen('file_di_testo_char_num.txt','rt');
    % 
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % SKIP_MODE 1
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    if(skip_mode == 1)
       %
       % Lettura delle righe da scartare
       %
       c=textscan(fp_orig,'%s',3,'delimiter','\n')
       %
       % Lettura dei valori numerici (due colonne: nella chiamata alla funzione
       % "textscan" bispgna specificare il "format" e, quindi, anche la quantità
       % di "colonne")
       %
       n=textscan(fp_orig,'%f%f');
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % SKIP_MODE 2
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    elseif(skip_mode == 2)
       n=textscan(fp_orig,'%f%f','headerlines',3)
    else
       error('Parametro "skip_mode" non definito o errato')
    end
    %
    % Conversione dell'output in una matrice (l'output della funzione
    % "textscan" è un "cell array"
    %
    M=[n{1}(:) n{2}(:)];
    %
    % Chiusura del file di input
    %
    fclose(fp_orig);
    
    
    Script 2
    %
    % Apertura del file di testo
    %
    fp_orig=fopen('file_di_testo_char_num.txt','rt');
    % 
    % Lettura del file "per righe" (parametro 'delimiter' = '\n' ed
    % identificazine delle righe da scartare basata sul codice ASCII del primo
    % carattere della riga letta
    % 
    while(~feof(fp_orig))
       c=textscan(fp_orig,'%s',1,'delimiter','\n');
       a=c{1}{1};
       if(((a(1) >= '0') && (a(1) <= '9')) || (a(1) == '.'))
          n_0=str2num(a);
          break
       end
    end
    % 
    % Lettura dei valori numerici (due colonne: nella chiamata alla funzione
    % "textscan" bnispgna specificare il "format" e, quindi, anche la quantità
    % di "colonne")
    % 
    n=textscan(fp_orig,'%f%f');
    % 
    % Conversione dell'output in una matrice (l'output della funzione
    % "textscan" è un "cell array"
    % 
    M=[n_0;n{1}(:) n{2}(:)];
    % 
    % Chiusura del file di input
    % 
    fclose(fp_orig);
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
3 risposte