كيف أقرأ في سلسلة من الأرقام باستخدام "Textscan" في Matlab إذا كان الملف في الغالب نصًا؟

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

  •  26-09-2019
  •  | 
  •  

سؤال

لدي ملف نصي يحتوي على سلسلة من 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top