¿Cómo se lee en una serie de números con “TextScan” en MATLAB si el archivo es principalmente texto?
Pregunta
Tengo un archivo de texto que tiene una serie de 3 números que tengo que leer en MATLAB.
Por ejemplo:
#######################
#
#
# 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
I necesita leer en esos 3 números en una matriz.
Por favor, ayuda.
Gracias
Solución
Si la mayor parte del archivo es irrelevante para su aplicación, sugiero procesamiento previo con la herramienta de lenguaje de script o de línea de comandos favorito para buscar las líneas relevantes y utilizar TextScan () en eso.
por ejemplo, desde un shell prompt:.
grep ^I_NEED_THIS_STRING infile > outfile
en Matlab:
fid = fopen('outfile');
C = textscan(fid, 'I_NEED_THIS_STRING = %f %f %f')
fclose(fid)
Vea la TextScan documentación para más detalles .
Otros consejos
Una alternativa es utilizar IMPORTDATA para leer todo el archivo en una matriz de células de cadenas (con una línea por célula), a continuación, utilizar STRMATCH para encontrar la celda que contiene la cadena de 'I_NEED_THIS_STRING'
, a continuación, utilizar sscanf para extraer los 3 valores de esa célula:
>> 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
Si el archivo tiene potencialmente mucho de texto inútil antes o después de la línea que le interesa, entonces puede usar una gran cantidad de memoria en MATLAB cargándolo todo en una variable. Esto se puede evitar por la carga y el análisis de una línea a la vez usando un bucle y la función 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