¿Cómo se lee en una serie de números con “TextScan” en MATLAB si el archivo es principalmente texto?

StackOverflow https://stackoverflow.com/questions/3620079

  •  26-09-2019
  •  | 
  •  

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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top