Come faccio a leggere in una serie di numeri che usano “textSCAN” in MATLAB se il file è in gran parte di testo?
Domanda
Ho un file di testo che hanno una serie di 3 numeri che ho bisogno di leggere in MATLAB.
Ad esempio:
#######################
#
#
# Text Text Text
#
#
#######################
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
I_NEED_THIS_STRING = 1234.5 6789.0 1234.5 !Comment blah blah blah
Ho bisogno di leggere in quei 3 numeri in un array.
Si prega di aiutare.
Grazie
Soluzione
Se la maggior parte del file è irrilevante per la vostra applicazione, vi suggerisco di pre-elaborazione con il tuo strumento di linguaggio di script o riga di comando preferito per trovare le linee rilevanti e utilizzare textSCAN () su questo.
per esempio, da una shell richiesta.
grep ^I_NEED_THIS_STRING infile > outfile
in MATLAB:
fid = fopen('outfile');
C = textscan(fid, 'I_NEED_THIS_STRING = %f %f %f')
fclose(fid)
Vedere la textSCAN documentazione per maggiori dettagli .
Altri suggerimenti
Un'alternativa è quella di utilizzare IMPORTDATA per leggere l'intero file in un array di celle di stringhe (con una linea per cella), quindi utilizzare STRMATCH per trovare la cella che contiene la stringa di 'I_NEED_THIS_STRING'
, quindi utilizzare sscanf per estrarre i 3 valori da quella cella:
>> data = importdata('mostly_useless_text.txt','\n'); %# Load the data
>> index = strmatch('I_NEED_THIS_STRING',data); %# Find the index of the cell
%# containing the string
>> values = sscanf(data{index},'I_NEED_THIS_STRING = %f %f %f') %# Read values
values =
1.0e+003 *
1.2345
6.7890
1.2345
Se il file ha potenzialmente molto di testo inutile prima o dopo la linea che ti interessa, allora si può utilizzare un sacco di memoria in MATLAB caricando il tutto in una variabile. È possibile evitare questo carico e l'analisi di una riga alla volta utilizzando un ciclo e la funzione FGETS :
fid = fopen('mostly_useless_text.txt','r'); %# Open the file
newLine = fgets(fid); %# Get the first line
while newLine ~= -1 %# While EOF hasn't been reached
if strmatch('I_NEED_THIS_STRING',newLine) %# Test for a match
values = sscanf(newLine,'I_NEED_THIS_STRING = %f %f %f'); %# Read values
break %# Exit the loop
end
newLine = fgets(fid); %# Get the next line
end
fclose(fid); %# Close the file