كيف أقرأ في سلسلة من الأرقام باستخدام "Textscan" في Matlab إذا كان الملف في الغالب نصًا؟
سؤال
لدي ملف نصي يحتوي على سلسلة من 3 أرقام أحتاج إلى قراءتها في MATLAB.
علي سبيل المثال:
#######################
#
#
# 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
أحتاج إلى القراءة في تلك الأرقام الثلاثة في صفيف.
الرجاء المساعدة.
شكرًا
المحلول
إذا كان معظم الملف غير ذي صلة بتطبيقك ، أقترح المعالجة المسبقة مع أداة البرمجة النصية المفضلة لديك أو أداة سطر الأوامر للعثور على الخطوط ذات الصلة واستخدام SextsCan () في ذلك.
على سبيل المثال ، من موجه قذيفة:
grep ^I_NEED_THIS_STRING infile > outfile
في ماتلاب:
fid = fopen('outfile');
C = textscan(fid, 'I_NEED_THIS_STRING = %f %f %f')
fclose(fid)
انظر توثيق النصوص لمزيد من التفاصيل.
نصائح أخرى
البديل هو الاستخدام بيانات الاستيراد لقراءة الملف بأكمله في مجموعة خلية من الأوتار (مع سطر واحد لكل خلية) ، ثم استخدم ستراماتش للعثور على الخلية التي تحتوي على السلسلة 'I_NEED_THIS_STRING'
, ، ثم استخدام SSCANF لاستخراج القيم الثلاث من تلك الخلية:
>> 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
إذا كان من المحتمل أن يكون الملف كثير من النص عديم الجدوى قبل أو بعد الخط الذي تهتم به ، يمكنك استخدام الكثير من الذاكرة في MATLAB عن طريق تحميل كل شيء في متغير. يمكنك تجنب ذلك عن طريق تحميل وتحليل سطر واحد في وقت واحد باستخدام حلقة والوظيفة 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