Come faccio a leggere in una serie di numeri che usano “textSCAN” in MATLAB se il file è in gran parte di testo?

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

  •  26-09-2019
  •  | 
  •  

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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top