我有一个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
将错过最后一行。
答案 0 :(得分:2)
<强>更新强>
使用新的样本输入,我可以确认没有任何内置方法可以正常工作。以下是使用textscan
和reshape
的解决方案:
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,:))
<强>上强>
如果没有示例文件,我只能根据我在本地创建的简单输入提出建议,而且在我看来,importdata
和load
都有效,具体取决于输入数据的结构。< / 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