【问题标题】:How can I parse this semicolon deliminted file?如何解析这个分号分隔的文件?
【发布时间】:2012-07-11 01:38:54
【问题描述】:

我有一个分号分隔的文件,格式如下:

Press;Temp.;CondF;Cond20;O2%;O2ppm;pH;NO3;Chl(a);PhycoEr;PhycoCy;PAR;DATE;TIME;excel.date;date.time
0.96;20.011;432.1;431.9;125.1;11.34;8.999;134;9.2;2.53;1.85;16.302;08.06.2011;12:01:52;40702;40702.0.5
1;20.011;433;432.8;125;11.34;9;133.7;8.19;3.32;2.02;17.06;08.06.2011;12:01:54;40702;40702.0.5
1.1;20.012;432.7;432.4;125.1;11.34;9;133.8;8.35;2.13;2.2;19.007;08.06.2011;12:01:55;40702;40702.0.5
1.2;20.012;432.8;432.5;125.2;11.35;9.001;133.8;8.45;2.95;1.95;21.054;08.06.2011;12:01:56;40702;40702.0.5
1.3;20.012;432.7;432.4;125.4;11.37;9.002;133.7;8.62;3.17;1.87;22.934;08.06.2011;12:01:57;40702;40702.0.5
1.4;20.007;432.1;431.9;125.2;11.35;9.003;133.7;9.48;4.17;1.6;24.828;08.06.2011;12:01:58;40702;40702.0.5

如何在 matlab 中将其解析为矩阵?我不关心第一行,但我想要矩阵中的其余行。它们不需要转换成双精度,矩阵可以由字符串组成。文件中有新行,代表一行的结束。新行之前没有分号。

感谢您的帮助。

【问题讨论】:

    标签: matlab file-io


    【解决方案1】:

    考虑用这段代码读取数据:

    fid = fopen('file.txt','rt');
    frmt = [repmat('%f ',1,12) '%s %s %f %s'];
    C = textscan(fid, frmt, 'Delimiter',';', 'CollectOutput',true, 'HeaderLines',1);
    fclose(fid);
    

    首先我们读入变量C的不同组成部分:前十二列是数字,接下来两列是字符串(我们将在下一步将它们转换为序列日期数字),另一个数字列,最后是字符串一:

    >> C
    C = 
        [6x12 double]    {6x2 cell}    [6x1 double]    {6x1 cell}
    

    正如我所提到的,我们可以将C{2} 解析并转换为序列日期:

    dt = datenum(strcat(C{2}(:,1),{' '},C{2}(:,2)), 'dd.mm.yyyy HH:MM:ss');
    

    现在我们可以将它们全部合并到一个单元格数组中作为表格。我们使用元胞数组而不是数值矩阵,因为最后一列仍然是字符串。

    >> data = [num2cell([C{1} dt C{3}]) C{4}]
    
    data = 
      Columns 1 through 7
        [0.96]    [20.011]    [432.1]    [431.9]    [125.1]    [11.34]    [8.999]
        [   1]    [20.011]    [  433]    [432.8]    [  125]    [11.34]    [    9]
        [ 1.1]    [20.012]    [432.7]    [432.4]    [125.1]    [11.34]    [    9]
        [ 1.2]    [20.012]    [432.8]    [432.5]    [125.2]    [11.35]    [9.001]
        [ 1.3]    [20.012]    [432.7]    [432.4]    [125.4]    [11.37]    [9.002]
        [ 1.4]    [20.007]    [432.1]    [431.9]    [125.2]    [11.35]    [9.003]
      Columns 8 through 14
        [  134]    [ 9.2]    [2.53]    [1.85]    [16.302]    [7.3466e+05]    [40702]
        [133.7]    [8.19]    [3.32]    [2.02]    [ 17.06]    [7.3466e+05]    [40702]
        [133.8]    [8.35]    [2.13]    [ 2.2]    [19.007]    [7.3466e+05]    [40702]
        [133.8]    [8.45]    [2.95]    [1.95]    [21.054]    [7.3466e+05]    [40702]
        [133.7]    [8.62]    [3.17]    [1.87]    [22.934]    [7.3466e+05]    [40702]
        [133.7]    [9.48]    [4.17]    [ 1.6]    [24.828]    [7.3466e+05]    [40702]
      Column 15
        '40702.0.5'
        '40702.0.5'
        '40702.0.5'
        '40702.0.5'
        '40702.0.5'
        '40702.0.5'
    

    【讨论】:

      【解决方案2】:

      您可以为此使用 textscan。

       fid = fopen('data.txt'); %open file
       headers = fgetl(fid);    %get first line
       headers = textscan(headers,'%s','delimiter',';'); %read first line
       format = repmat('%s',1,size(headers{1,1},1)); %count columns and make format string
       data = textscan(fid,format,'delimiter',';'); %read rest of the file
       data = [data{:}];
      

      【讨论】:

        【解决方案3】:

        晚上最大。

        我将假设您已经能够从文件中导入数据或以其他方式将其导入 Matlab。我通常用于此类数据的方法将其保留在单元格的列矩阵中。然后每个单元格都包含文件中的一行数据。

        然后,您可以将单元格转换为字符矩阵,并使用regexp 将该数据解析为更易于使用的矩阵,其中顶行是您的标题数据。

        如果您遇到困难,只需发布​​一些代码,我们可以解决它。

        干杯!

        更新:

        这是我正在谈论的代码。

        A = importdata('filepath\sample.txt') %This uses the newline on each line to make a new row.
        B= [];
        for(n = 1:size(A,1))
            B = [B;regexp(cell2mat(A(n)),';','split')]; %This uses the ; to split the string
        end
        

        Matlab 索引始终以(行、列)格式完成。所以像 matrix(2,3) 这样的东西会在第 2 行第 3 列的位置调用一个项目。Matlab 也总是从 1 开始索引,而不是像许多其他语言那样从 0 开始。

        如果您有单行或单列(通常称为向量),则只需调用 matrix(4) 并返回第 4 个元素。如果您愿意,您还可以在矩阵中添加 3 层或更多层。如果你愿意,可以考虑一个矩阵矩阵。

        在将可变长度数据存储在单个位置时,单元格非常有用。当数据存储在单元格中时,它仍然以与矩阵相同的方式调用,但您必须将其从单元格类型转换为矩阵 (cell2mat) 以用于某些用途。你会很快学会这些。还有其他方法可以从单元格转换,例如 cell2num。

        希望对您有所帮助!

        【讨论】:

        • 请注意,这样做可能不是最佳做法,但在我看来,它应该让你开始走上这条道路。
        • 我其实是在找一些matlab代码。我可以用许多其他语言解决这个问题,但我发现编写 matlab 代码非常困难。我现在做的研究是我第一次使用matlab。单元格列矩阵的语法是什么(什么是单元格?),以及如何实际使用正则表达式。在我看来,matlab 的文档过于冗长,并且从未阐明解决常见问题的正确方法。感谢您的帮助。
        • 更新了一个简短的示例和一些附加信息。
        猜你喜欢
        • 2016-05-25
        • 2013-09-01
        • 2016-06-22
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2015-01-18
        相关资源
        最近更新 更多