2015-04-27 83 views
3

我的问题是,我有以下格式的CSV数据:阅读CSV用分号与逗号分隔的MATLAB数据为十进制标记

1,000333e+003;6,620171e+001 
1,001297e+003;6,519699e+001 
1,002261e+003;6,444984e+001 

我想读取数据到MATLAB,但csvread要求用逗号分隔,并且我一直无法找到逗号 - 小数点标记的解决方案。我想我可以用某种方式使用textscan

我很抱歉问这样一个(我认为)简单的问题,但我希望有人可以提供帮助。这里没有任何其他问题/答案似乎在处理逗号和分号的组合。

+0

如果“进口数据“按钮的作品,尝试'importdata'作为一个函数。我也认为这可能取决于你的语言环境。例如如果你在命令行执行'str2num('1,000333e + 003')',它能正确转换吗? – nkjt

回答

5

EDIT3(接受的答案):在家里的工具栏,可以自定义数据的导入方式的可变部分使用进口数据按钮。一旦完成,您可以单击箭头下方的导入选择并生成一个脚本或函数,该脚本或函数将遵循导入数据窗口中定义的相同规则。

import Data Instructions

----------------------------------------- --------- 留作参考 ------------------------------------ --------------

您可以使用dlmread它工作在以下格式

M = dlmread(filename,';')

的文件名是与该文件的,除非完整路径字符串该文件在当前工作目录,在这种情况下,您只需输入文件名即可。

编辑1:改为使用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 
+0

不幸的是,通过这样做,我被告知“文件和格式字符串不匹配。从文件(行号1,字段编号2)==>,000333e + 003; 6,620171e + 001 \ n “ –

+0

您是否尝试使用主页选项卡上的导入数据按钮?还是导入必须在代码中?你可以在gui中选择delimeter类型 – bilaly

+0

导入数据按钮的工作原理(它可以识别逗号和分号),但我真的更喜欢它是在代码/编辑器中,因为我有很多文件。 –

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