2013-07-20 17 views
2

我想使用matlab在一个矩阵中加载一个csv文件。Textscan生成一个vectore两倍于预期的大小

我用下面的代码:

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文件导入彩车的每个元素...

新编辑:更仔细地 阅读textscan文件,我认为这个问题是我的输入文件既不是一个文本文件也不是STR,但含有一个文件漂浮

编辑:3条从文件

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.29369 75319,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

+1

您的CSV文件是如何创建的?你可能在每一行的末尾有一个尾随逗号?如果你通过'dlmwrite('test.csv',rand(1e3,21),',')'写了一个100行和21列的文件,你能够按照预期读取它吗? – horchler

+0

@horchler请看编辑的问题 – bigTree

+1

将文件上传到某处并粘贴链接,以便我们试试看。 – Oleg

回答

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); 
2

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

当我认为文件是以某种方式写入,但实际上是以另一种方式写入的时候,我面临着一个类似于你的阅读问题。要调试它,我使用fgetl并为每行读取打印fgetl的输出和它的double版本(请参见下面的示例)。检查双版本,你可能会发现哪个角色导致问题。

就你而言,我首先会看到多个分隔符(','和'\ t'),并在'textscan'中激活选项'MultipleDelimsAsOne'(关闭'CollectOutput') 。

fid = fopen(filename); 

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

    disp(tline); 
    double(tline) 
    pause; 

    tline = fgetl(fid); 
end 

fclose(fid); 
+0

我运行了您发送给我的代码。然而,出于一个奇怪的原因,显示的数字不是csv文件中的数字......我也试着用',','\ t来改变分隔符(我认为这是问题的根源) ','\ n',但仍然是同样的问题... – bigTree

+1

double('1':'9')为您提供其字符串形式中的数字的acsii代码。你没有相同的数字,因为数字1的编码是49,数字2的编码是50,而逗号是编码的44.在你的输出中,你只能有44和49到57,因为你只有逗号和数字。如果您有32(空格)或10(制表)等数字,则可能是读数失败的原因。 – marsei