我的问题是,我已经获得了以下格式的CSV数据:
1,000333e+003;6,620171e+001
1,001297e+003;6,519699e+001
1,002261e+003;6,444984e+001
我想将数据读入matlab,但是csvread
要求它以逗号分隔,并且我无法找到逗号小数标记的解决方案。我想我可以用某种方式使用textscan
吗?
答案 0 :(得分:8)
EDIT3(接受的答案):使用主工具栏变量部分中的导入数据按钮,可以自定义数据的导入方式。完成后,您可以单击箭头下方的导入选择,并生成将遵循导入数据窗口中定义的相同规则的脚本或函数。
----------------------------------------------- --- 保留供参考 ------------------------------------- -------------
您可以使用dlmread,它可以采用以下格式
M = dlmread(filename,';')
文件名是一个包含文件完整路径的字符串,除非文件在当前工作目录中,在这种情况下你只需键入文件名。
EDIT1:使用textscan代替,以下代码应该可以解决这个问题,或者至少应该使用大部分代码。
%rt is permission r for read t for open in text mode
csv_file = fopen('D:\Dev\MATLAB\stackoverflow_tests\1.csv','rt');
%the formatspec represents what the scan is 'looking'for.
formatSpec = '%s%s';
%textscan inputs work in pairs so your scanning the file using the format
%defined above and with a semicolon delimeter
C = textscan(csv_file, formatSpec, 'Delimiter', ';');
fclose(csv_file);
显示结果。
C{1}{1} =
1,000333e+003
C{1}{2} =
1,001297e+003
C{1}{3} =
1,002261e+003
C{2}{1} =
6,620171e+001
C{2}{2} =
6,519699e+001
C{2}{3} =
6,444984e+001
EDIT2:用点替换逗号并转换为double类型的整数:
[row, col] = size(C);
for kk = 1 : col
A = C{1,kk};
converted_data{1,kk} = str2double(strrep(A, ',', '.'));
end
celldisp(converted_data)
结果:
converted_data{1} =
1.0e+03 *
1.0003
1.0013
1.0023
converted_data{2} =
66.2017
65.1970
64.4498
答案 1 :(得分:0)
% Data is in C:\temp\myfile.csv
fid = fopen('C:\temp\myfile.csv');
data = textscan(fid, '%s%s', 'delimiter', ';');
fclose(fid);
% Convert ',' to '.'
data = cellfun( @(x) str2double(strrep(x, ',', '.')), data, 'uniformoutput', false);
data =
[3x1 double] [3x1 double]
data{1}
ans =
1.0e+03 *
1.000333000000000
1.001297000000000
1.002261000000000
data{2}
ans =
66.201710000000006
65.196990000000000
64.449839999999995