我想使用 matlab 在矩阵中加载 csv 文件。
我使用了以下代码:
formatSpec = ['%*f', repmat('%f',1,20)];
fid = fopen(filename);
X = textscan(fid, formatSpec, 'Delimiter', ',', 'CollectOutput', 1);
fclose(fid);
X = X{1};
csv 文件有 1000 行和 21 列。 然而生成的矩阵X有2000列和20列。
我尝试使用不同的分隔符,例如“\t”或“\n”,但它没有改变。 当我显示 X 时,我注意到它显示了正确的 csv 文件,但每 2 行有额外的零行。
我也tried添加“HeaderLines”参数:
`X = textscan(fid, formatSpec1, 'Delimiter', '\n', 'CollectOutput', 1, 'HeaderLines', 1);`
但这一次,结果是一个空矩阵。
我错过了什么吗?
编辑:@horchler
我可以毫无问题地读取“test.csv”文件。 每行末尾没有多余的逗号。我使用 python 脚本生成了 csv 文件:我读取了另一个 csv 文件的行,修改了这些行(选择其中一些并对它们进行算术运算),并将新行写入另一个 csv 文件。为了做到这一点,我将第一个 csv 文件的每个元素转换为 float ...
新编辑: 仔细阅读textscan文档,我认为问题在于我的输入文件既不是textfile也不是str,而是包含 float 的文件
编辑:文件中的三行
0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,2 1,-0.3834323,-1.92452324171,-1.2453254094,0.43455627857,-0.24571121,0.4340657,1,1,0,0,0,0.3517396202,1,0,0,0.3558122164,0.2 936975319,0.4105696144,0,1,0 -0.78676,-1.09767,0.765554578,0.76579043,0.76,1,0,0,323124.235998,1,0,0,0,1,0,0,1,0,0,0,2
最佳答案
使用正则表达式怎么样?
X=[];
fid = fopen(filename);
while 1
fl = fgetl(fid);
if ~ischar(fl), break, end
r =regexp(fl,'([-]*\d+[.]*\d*)','match');
r=r(1:21); % because your line 2nd is somehow having 22 elements,
% all lines must have same # elements or an error will be thrown
% Error: CAT arguments dimensions are not consistent.
X=[X;r];
end
fclose(fid);
关于matlab - Textscan 生成预期大小两倍的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17765226/