2

我想使用 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 行有额外的零行。

我还尝试添加“HeaderLines”参数:

`X = textscan(fid, formatSpec1, 'Delimiter', '\n', 'CollectOutput', 1, 'HeaderLines', 1);`

但这一次,结果是一个空矩阵。

我错过了什么吗?

编辑:@horchler

我可以毫无问题地阅读“test.csv”文件。每行末尾没有多余的逗号。我使用 python 脚本生成了我的 csv 文件:我读取了另一个 csv 文件的行,修改了这些行(选择其中一些并对它们进行算术运算)并将新行写入另一个 csv 文件。为了做到这一点,我将第一个 csv 文件的每个元素转换为浮点数......

新编辑:更仔细地阅读 textscan 文档,我认为问题在于我的输入文件既不是文本文件也不是 str,而是包含浮点数的文件

编辑:文件中的三行

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.2936975319,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

4

2 回答 2

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);
于 2013-07-21T00:04:48.843 回答
2

使用csvread读取 csv 文件似乎是一个不错的选择。但是,我也倾向于使用 textscan 读取 csv 文件,因为文件有时写得不好。因此,有更多的选择来阅读它们是必要的。

当我认为文件是以某种方式编写但实际上是以另一种方式编写时,我会遇到像您这样的阅读问题。为了调试它,我使用fgetl并为读取的每一行打印 fgetl 的输出及其双重版本(参见下面的示例)。检查双重版本,您可能会发现哪个字符导致了问题。

在您的情况下,我将首先查看多次出现的分隔符(',' 和 '\t'),并且在 'textscan' 中,我将激活选项 'MultipleDelimsAsOne'(同时关闭 'CollectOutput')。

fid = fopen(filename);

tline = fgetl(fid);
while ischar(tline)

    disp(tline);
    double(tline)
    pause;

    tline = fgetl(fid);
end

fclose(fid);
于 2013-07-20T21:08:58.263 回答