Comment puis-je lire dans une série de chiffres à l'aide « textscan » dans MATLAB si le fichier est principalement du texte?
Question
J'ai un fichier texte qui ont une chaîne de 3 chiffres que je dois lire dans Matlab.
Par exemple:
#######################
#
#
# 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
Je dois lire dans ces 3 numéros dans un tableau.
AIDE S'IL VOUS PLAÎT.
Merci
La solution
Si la plupart du fichier est hors de propos à votre demande, je vous suggère de pré-traitement avec votre dessus.
outil de langage de script favori ou ligne de commande pour trouver les lignes et utiliser textscan pertinentes ()par exemple, à partir d'une coque rapide:.
grep ^I_NEED_THIS_STRING infile > outfile
Matlab:
fid = fopen('outfile');
C = textscan(fid, 'I_NEED_THIS_STRING = %f %f %f')
fclose(fid)
Consultez la documentation textscan pour plus de détails .
Autres conseils
Une autre solution consiste à utiliser IMPORTDATA lire le fichier entier dans un réseau de cellules de chaînes (avec une ligne par cellule), puis utilisez strmatch pour trouver la cellule qui contient la chaîne 'I_NEED_THIS_STRING'
, puis utilisez sscanf pour extraire les valeurs 3 à partir de cette cellule:
>> 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 le fichier a potentiellement beaucoup de texte inutile avant ou après la ligne qui vous intéresse, vous pouvez utiliser beaucoup de mémoire dans Matlab en chargeant tout dans une variable. Vous pouvez éviter cela en une ligne de chargement et l'analyse à la fois en utilisant une boucle et la fonction 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