在matlab中读取复杂的CSV文件

时间:2013-05-20 13:48:54

标签: matlab csv

我有一个巨大的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但放弃了,因为阅读时间太长。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

  1. 阅读这些行(例如,使用textscan)。
  2. 用空格替换分隔符(例如,用regexprep
  3. 在每一行上应用str2num以提取数值:
  4. 以下是示例代码:

    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{:}];
    

答案 1 :(得分:0)

这应该有效:

>> 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