【问题标题】:reading a complicated CSV file in matlab在 matlab 中读取复杂的 CSV 文件
【发布时间】:2013-05-20 22:20:46
【问题描述】:

我有一个巨大的 csv 文件,类似于:

0, "24 44 43 51......"
1, "99 81 34 58......"

每行中的点代表更多的数字。每行都有一个序列号,例如。 0, 1, 2... 和相应的数字(大约 1000)。我在这个文件中有超过 1000 行。有什么方法可以在由行和列组成的矩阵中读取此文件,例如:

0 24 44 43 51......(more data)
1 99 81 34 58......(more data)
.
.
.

我尝试过tdfread,但因为阅读时间太长而放弃了。任何帮助将不胜感激。

【问题讨论】:

  • 对于这样的东西,我发现通过 python 或 perl 运行文件并将其转换为 Matlab 更喜欢的格式更容易。例如,如果你可以让所有的数字用逗号分隔就行,你可以在Matlab中简单地load filename

标签: matlab csv


【解决方案1】:

这是我在这种情况下推荐的一般方法:

  1. 读取行(例如,textscan)。
  2. 用空格替换分隔符(例如,用regexprep
  3. 在每一行应用str2num以提取数值:

这里是示例代码:

fid = fopen(filename, 'r');
C = textscan(fid, '%s', 'Delimiter', '');
C = cellfun(@str2num, regexprep(C{:}, '[",]', ' '), 'UniformOutput', false);
fclose(fid);

结果是一个数字向量元胞数组,每行一个向量。如果所有向量具有相同数量的元素,则可以将元胞数组转换为矩阵:

M = vertcat(C{:});

替代解决方案

如果您事先知道每行的值数量(我们将其表示为N),您可以使用更短的语法:

fid = fopen(filename, 'r');
C = textscan(fid, repmat('%f', 1, N), 'Delimiter', '", \b\t', 'MultipleDelimsAsOne', true);
fclose(fid);
M = [C{:}];

【讨论】:

    【解决方案2】:

    这应该可行:

    >> n = 2;    % The number of lines; 1000 in your case.
    >> A = textread('test1.txt','%d','delimiter',', "','emptyvalue',0);
    >> B = reshape(A,uint64(numel(A)/n),n)';
    >> B = B(:,[1, 3:end]);
    

    对于 test1.txt 中的输入为:

    0, "24 44 43 51"
    1, "99 81 34 58"
    

    结果是:

    >> B
    
    B =
    
         0    24    44    43    51
         1    99    81    34    58
    

    【讨论】:

    • linse(n)的数量不知道怎么办?
    • @EitanT:好吧,这不行;我必须为此努力。就此而言,我还想知道如何处理每行可变数量的值。
    • 您必须将值存储在单元格中。查看我的解决方案:)
    • @EitanT: 啊.. 好一个。 :)
    猜你喜欢
    • 2013-10-31
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多