0

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

4

2 回答 2

2

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

  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{:}];
于 2013-05-20T13:57:09.317 回答
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
于 2013-05-20T14:12:28.160 回答