Matlab在文本文件中搜索字符串并在LOOP中打印下一行

时间:2013-06-27 00:37:47

标签: matlab file text import

我想在文本文件中找到一个字符串'Month',其中包含数字和其他信息,例如

  

*我的名字是Dee

     

*月

     

2 3 4

     

3 6 8

     

4 87 9

     

*日

     

1,4,67,

     

2,6,98,

     

3,55,89,

     

4,12,34,

     

* DAS

     

* GFSD

     

* GDFD

     

* sdasd

     

*文件结尾

并创建这些数字的数组。接下来,我想搜索下一个字符串'Day',并创建相应数字的数组。

目前我正在运行一个循环,搜索所有字符两次并找到数字。这使得程序非常慢。任何人都可以建议更快 这样做的方法?

strToSearchFor = 'Month'; 
lengthStrToSearchFor = length(strToSearchFor); 
MonthArrayFlag =0;

for i=1:lengthAllFileChars
    fseek(fid9,i-1, 'bof');                                     
    tline = fscanf(fid9,'%c',lengthStrToSearchFor);
    if (strcmp(strToSearchFor,tline)==1)
        'FOUND IT';
        tline;
        for a = 1:lengthAllFileChars                        
            MonthNumber = fscanf(fid9, '%f,')';     
            if MonthArrayFlag == 0;
                MonthArray = zeros(1,4);                     
                MonthArray(1,:) =  nodeCoordinates;
                MonthArrayFlag = 1;
            else
                MonthArray = vertcat(MonthArray,MonthNumber);
            end
        end         
    end
end

然后对'DAY'重复此代码。

2 个答案:

答案 0 :(得分:0)

您检查过“textscan”功能吗?您可以一次性逐行读取文本文件(textscan(fid,'%s'))并检查关键字MONTH或DAY,如果它是一个未命中,那么它是其中一个数字数组,您可以在其中转动它通过函数“str2num”将字符串转换为矩阵。如果您需要有关代码的帮助,我可能会为您提供一些粗略的代码但不确定何时。 使用访问文件的函数越少,程序运行的速度就越快。这就是文本扫描进入的地方,它读取所有内容并将其放在一个或多个单元格数组中。

答案 1 :(得分:0)

完全按照其他海报的建议使用文本扫描,这将(应该?)返回一个单元格数组,其中包含空格的所有内容都被分隔到自己的单元格中。

现在不要通过每个单元格等等。请改为:

monthInd=find(strcmp('Month',yourNewCellArray)) 
%Keep in mind this IS case sensitive

dayInd= same thing ^^^ for day

endOfDayInd = same thing, 
%hopefully you have some way of knowing when numbers stop? 

然后你可以这样做:

monthVals=cell2mat(yourNewCellArray(monthInd+1:dayInd-1)) 
%pretty sure its () in this case rather than {}

唯一需要注意的是这个和其他海报的方法是值现在是一个向量而不是一个3x3矩阵。如果你不需要它们在矩阵中,或者可以重塑你的矢量矩阵,你很高兴。

如果没有,那么所有的希望都不会丢失!将textscan中的'%s'替换为char(10)..这是新行char。理想情况下,您的代码不需要更改以查找月份和日期索引,但现在每行中的数字将是其自己的单独字符串。

这可能需要一些调整,如果可能的话,可能需要一些先验知识,但至少应该给你一些想法:)