Wie kann ich in einer Reihe von Zahlen mit „Textscan“ in MATLAB lesen, wenn die Datei hauptsächlich Text ist?
Frage
Ich habe eine Textdatei, die eine Reihe von 3 Zahlen hat, dass ich in MATLAB lesen muß.
Beispiel:
#######################
#
#
# 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
Ich brauche in diesen drei Zahlen in ein Array zu lesen.
Bitte helfen.
Danke
Lösung
Wenn die meisten der Datei auf Ihre Anwendung irrelevant ist, schlage ich vor, eine Vorverarbeitung mit Ihrem Lieblings-Skriptsprache oder Kommandozeilen-Tool die entsprechenden Zeilen zu finden und verwenden textscan () auf dem.
z, aus einem Shell-Prompt:.
grep ^I_NEED_THIS_STRING infile > outfile
in Matlab:
fid = fopen('outfile');
C = textscan(fid, 'I_NEED_THIS_STRING = %f %f %f')
fclose(fid)
Sehen Sie die textscan Dokumentation für weitere Details .
Andere Tipps
Eine Alternative ist IMPORT lesen Sie die gesamte Datei in eine Zelle Array von Strings (mit einer Zeile pro Zelle), dann verwenden Sie STRMATCH die Zelle zu finden, die die Zeichenfolge 'I_NEED_THIS_STRING'
enthält, dann verwenden Sie sscanf die 3 Werte aus dieser Zelle zu extrahieren:
>> 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
Wenn die Datei möglicherweise viel von nutzlosem Text vor oder nach der Zeile, die Sie interessiert sind, dann können Sie eine Menge Speicher in MATLAB durch Laden sie alle in eine Variable aufbrauchen. Sie können dies durch das Laden vermeiden und eine Zeile zu einem Zeitpunkt Parsen einer Schleife und die Funktion 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