Ci sono diversi modi per risolvere il problema.
Il metodo più semplice consiste nell'utilizzare l'i
mportazione 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.