【问题标题】:Matlab search for string in a text file and print the next line in a LOOP [closed]Matlab在文本文件中搜索字符串并在LOOP中打印下一行[关闭]
【发布时间】:2013-06-27 00:37:46
【问题描述】:

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

*我的名字是迪伊

*月

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' 重复此代码。

【问题讨论】:

  • @M42 -guys,虽然这个问题可能相当模糊,但这个问题在它所问的问题上显然是具体的(我几乎会争论很多)。我认为在这种情况下,说这个问题不够具体或可重复是没有意义的。如果您要结束这个问题,至少要出于正确的理由这样做..

标签: matlab file text import


【解决方案1】:

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

现在不要遍历每个单元格等,而是这样做:

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。理想情况下,您的代码不需要更改即可找到月份和日期索引,但现在中间的每一行数字将是其自己的单独字符串。

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

【讨论】:

  • 感谢您的回复,我没有关于月份信息中有多少行的任何信息,我想扫描整个文件并为标题 Month 下的数字和“Day 的另一个数组”创建数组'....如果可能的话,您能否提供有关代码外观的线索?谢谢大家!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2011-06-14
    • 2016-10-20
    相关资源
    最近更新 更多