【问题标题】:Acquire data from text files in MATLAB在 MATLAB 中从文本文件中获取数据
【发布时间】:2011-04-04 18:47:03
【问题描述】:

我在获取以特定方式结构化的数据块时遇到了一个大问题。 以下是获取数据的方式(为 txt):

V|0|0|0|t|0|1|1|4|11|T4|H13||||||||||||
P|40|0.01|10|1|1|0|40|1|1|1||1|*||0|0|0
*|A1|A1|A7|A16|F|F|F|F|F|F|||||||||||||
*|codserv|area|codice|nome|tnom|tmin|tmax|pc|qc|susc|||||||
*|||||kV|kV|kV|MW|MVAR|S||||||||||||
N|I|1|N01|N01|132|125.4|138.6|0|0||||||||
N|I|1|N02|N02|20|19|21|0|0|||||||||||||
N|I|1|N03|N03|20|19|21|1.013532234|0.49087611||||||||
N|I|1|N04|N04|20|19|21|0.390791617|0.189269056||||||||
N|I|1|N05|N05|20|19|21|0.180634542|0.121387171||||||||
N|I|1|N06|N06|20|19|21|0.709472564|0.343613323||||||||
N|I|1|N07|N07|20|19|21|0.103495727|0.069549543||||||||
N|I|1|N08|N08|20|19|21|0.351712456|0.170342158||||||||
N|I|1|N09|N09|20|19|21|0.097697904|0.06565339||||||||
N|I|1|N10|N10|20|19|21|0.162165157|0.078540184||||||||

算法应该:

  • 跳过前 3 行

  • 跳过第五行

  • 第四行

    *|codserv|area|codice|nome|tnom|tmin|tmax|pc|qc|susc|||||||
    

    将每个字符串保存在一个空向量中

    codeserv=[]
    area=[]
    codice=[]
    nome=[]
    tnom=[]
    tmin=[]
    tmax=[]
    pc=[]
    qc=[]
    susc=[]
    
  • 在第四行之后的行中用数据和字符串填充向量

    codeserv=[N N N N N N N N N N ....]
    area=[I I I I I I I ....]
    codice=[1 1 1 1 1 1 ...]
    nome=[N01 N02 N03 N04 N05 ]
    tnom=[N01 N02 N03 N04 N05]
    tmin=[132 20 20.....]
    tmax=[125.4 19 19 19 ....]
    pc=[138.6 21 21 21....]
    qc=[0 0 1.013532234 ....]
    susc=[0 0 0.49087611]
    

【问题讨论】:

    标签: matlab file-io text-files


    【解决方案1】:

    Matlab 有什么理由吗?如果您在学术界,您可能可以访问 LabVIEW,这样的东西可能更容易学习。您需要使用从文本文件中读取 VI,然后解析字符串。当然,你必须使用“|”字符来分隔数据(使用匹配模式 VI)。您可能最终也希望重组数据存储到文本文件的方式 - 使用文本键而不是 |。比如:

    codserv N area | codice 1 nome N01 tnom 20 等等...

    很抱歉没有提供一些 Matlab 源代码的答案,但如果可以的话,我会考虑使用 LabVIEW。

    【讨论】:

    • 这是他们必须使用matlab的项目的一部分。事实上,数据将在 MATLAB 中的算法中获取。我也更喜欢使用 Labview,但我不能。
    • 好的,你可能想用制表符(或逗号)替换|。然后将文本文件打开为制表符分隔的矩阵(如果使用逗号,则为 CSV)。祝你好运。
    【解决方案2】:

    看看textscan

    您对文本文件的格式有任何控制权吗?

    编辑

    这是实现结果的一种相当老套的方法

    function readtest()
    
    fid = fopen('test.txt'); 
    
    %skip 3 lines, save 4th, skip 5th
    for i = 1:4
        names = fgetl(fid);
    end
    fgetl(fid);
    
    % separate out names
    names = textscan(names,'%s','delimiter','|');
    
    % read the data
    data = textscan(fid,'%s %s %d %s %s %d %d %f %f %f %[| ]','delimiter','|');
    
    fclose(fid);
    
    
    
    
    for i = 1:size(data,2)-1
        values = ( data{i}(1:end));
        if(iscell(values))
            values = cell2mat(values);
        end
    
        name = names{1}{i+1};
    
        % very basic error checking
        if(~strcmp(name, ''))
    
            %save the value in the calling work space
            assignin('caller', name, values)
        end
    end
    

    【讨论】:

    • 我同意...如果留在 Matlab 中,可能需要重新调整格式。
    • 我认为可能需要重新调整格式以使任何语言的任务更容易 - 即使使用 LabVIEW。
    • 感谢您的帮助,我正在尝试您提出的解决方案。你真的是第二个伟大的程序员!!!
    • 不幸的是,我无法控制该文件,因为它是一种文本格式,但由 C 程序生成,并且该程序是可执行文件 (.exe)
    • "second" 我的邮件是fruitstorm@gmail.com .email 或者msn 我们可以谈谈,我遇到的问题很小但是很难解释清楚。
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多