读取混合行尾为

时间:2015-06-04 20:30:23

标签: matlab csv file-io

我有一个csv文件,其混合行结尾为'\ n'和'\ r \ n'。使用csvread时,csvread将报告错误,并且在使用文本扫描时,textscan将仅在行结束字符更改之前扫描内容。 如何在matlab中输入此文件而不预处理文件以修复行结尾?

示例文件:

 fid = fopen('ex1.csv', 'w');
 fprintf(fid, 'A,B,C\n');
fprintf(fid, '1,1,1\n');
 fprintf(fid, '2,2,2\r\n');
fprintf(fid, '3,3,3\r\n');
fclose(fid);

请注意,标题限制了load的使用,importdata将错过最后一行。

2 个答案:

答案 0 :(得分:2)

<强>更新

使用新的样本输入,我可以确认没有任何内置方法可以正常工作。以下是使用textscanreshape的解决方案:

fid = fopen('ex1.csv');
inputMatrix = textscan(fid, '%s', 'delimiter', ',');
fclose(fid);
inputMatrix = reshape(a{1}, 3, [])';    %'//assuming 3 columns in file

>> inputMatrix 
    'A'    'B'    'C'       
    '1'    '1'    '1'       
    '2'    '2'    [1x2 char]    %//the 2nd char is "\r"
    '3'    '3'    [1x2 char]

或者,当方便的功能不起作用时,我通常只会恢复旧式的文件读取方式:

fid = fopen('ex1.csv');
inputMatrix = {};
while ~feof(fid)
    line = fgetl(fid);
    inputMatrix(end+1,:) = strsplit(line, ',');
end
fclose(fid);

>> inputMatrix
inputMatrix = 
    'A'    'B'    'C'
    '1'    '1'    '1'
    '2'    '2'    '2'
    '3'    '3'    '3'

请注意,这样做的好处是不关心有多少列,而且它也不包括\r

在任何情况下,您可能希望数字是数字矩阵而不是字符串的单元格矩阵。对str2double的简单调用会为您执行此操作(并且会巧妙地忽略任何\r):

str2double(inputMatrix(2:end,:))

<强>上

如果没有示例文件,我只能根据我在本地创建的简单输入提出建议,而且在我看来,importdataload都有效,具体取决于输入数据的结构。< / p>

示例输入1:

>> fid = fopen('ex1.csv', 'w');
>> fprintf(fid, '1,1,1\n');
>> fprintf(fid, '2,2,2\r\n');
>> fprintf(fid, '3,3,3\n');
>> fclose(fid);

>> a = importdata('ex1.csv')
ans = 
     1     1     1
     2     2     2
     3     3     3
>> a = load('ex1.csv')
ans = 
     1     1     1
     2     2     2
     3     3     3

示例输入2:

>> fid = fopen('ex2.csv', 'w');
>> fprintf(fid, '1,1,1\n');
>> fprintf(fid, '2,2,2\r\n');
>> fprintf(fid, '3,3\n');
>> fclose(fid);

>> a = importdata('ex2.csv')
ans = 
     1     1     1
     2     2     2
     3     3     NaN
>> a = load('ex2.csv')
Error using load
Number of columns on line 3 of ASCII file ex2.csv must be the same as previous lines. 

答案 1 :(得分:0)

我最终得到了

fid = fopen('ex1.csv');
inputMatrix = cell2mat(textscan(fid, '%f%f%f%*[^\n]', 'delimiter', ',','headerLines',1));
fclose(fid);


>> inputMatrix

inputMatrix =

     1     1     1
     2     2     2
     3     3     3