将CSV导入为double?

时间:2017-05-02 09:25:58

标签: matlab data-import

我希望在数据导入方面提供一些帮助。作为背景,我测试了30个产品,每个产品3次,总共有90个独特的文件(分为三个)。

我的每个原始数据文件都有不同的行数,并且包含一个包含9列的标题行(我对标题不感兴趣)。在这种情况下,我只对获得1,3和1,3列感兴趣。 4。

我已将所有.csv移动到一个文件夹中,并且我使用了一个文件抓取器(从Stackoverflow获取)将csv数据带入工作区,如下所示:

[file,dir,filterIndex] =  uigetfile( ...
{'*.csv', '*.csv';
'*.*',  'All Files (*.*)'}, ...
'Select files',...
'Multiselect', 'on');

if ischar(file)
    file = {file};
end
n = length(file);
d = cell(n,1);

这带来< 90x1>细胞。 以下是我用来导入数据并从单元格转换为双精度的内容 - 正如您所看到的那样,它是相当费力的...有没有人有办法减少我正在做的复制粘贴量?

for k = 1:n
fid = fopen([dir,file{k}]);
d{k} = textscan(fid,'%f %f %f %f %*[^\n]',...
       'delimiter',',','HeaderLines',1);
fclose(fid);
end

A = vertcat(d{:});
Q = cell2mat(A(:,[1,3,4]));
s1 = cell2mat(A(1,[1,3,4]));
s2 = cell2mat(A(2,[1,3,4]));
s3 = cell2mat(A(3,[1,3,4]));
ss1 = (s1(1,2)+s2(1,2)+s3(1,2))/3;
s4 = cell2mat(A(4,[1,3,4]));
s5 = cell2mat(A(5,[1,3,4]));
s6 = cell2mat(A(6,[1,3,4]));
ss2 = (s4(1,2)+s5(1,2)+s6(1,2))/3;
.
.
.
s88 = cell2mat(A(88,[1,3,4]));
s89 = cell2mat(A(89,[1,3,4]));
s90 = cell2mat(A(90,[1,3,4]));
ss30 = (s88(1,2)+s89(1,2)+s90(1,2))/3;

如果可能的话,我很乐意将连续列中的数据放在一个矩阵中(尽管如前所述,文件的长度不同)。 矩阵'Q'只是一个测试 - 它带来了所有数据,但在三个非常长的列中,这不是我想要的。

我正在按要求从csv中添加一些数据:

's1 = Time,Voltage_0,Med_PSense,FC_Flow_Meter,Voltage_3,Voltage_4,Voltage_5,Voltage_6,Voltage_7
0.0000,0.2431,-0.1334,-0.2381,1.4003,1.3917,1.3986,1.4045,1.4047
0.0100,0.2119,-0.1120,-0.1878,1.4029,1.3968,1.3910,1.3994,1.3996
0.0200,0.2119,-0.1120,-0.2130,1.4080,1.3917,1.3961,1.3994,1.4022
0.0300,0.2119,-0.1120,-0.2297,1.4003,1.3993,1.3961,1.3994,1.4047
0.0400,0.2015,-0.0905,-0.2297,1.3978,1.3968,1.3935,1.3994,1.3996`

's2 = Time,Voltage_0,Med_PSense,FC_Flow_Meter,Voltage_3,Voltage_4,Voltage_5,Voltage_6,Voltage_7
0.0000,0.2639,-0.1334,-0.2381,1.4003,1.3993,1.4037,1.3994,1.3920
0.0100,0.2431,-0.0905,-0.2381,1.4003,1.4019,1.4037,1.3994,1.3945
0.0200,0.2535,-0.1762,-0.2465,1.4029,1.4044,1.3986,1.3994,1.3996
0.0300,0.2119,-0.1548,-0.2130,1.4029,1.3993,1.3935,1.3994,1.3996
0.0400,0.2223,-0.1334,-0.2046,1.4003,1.3917,1.3910,1.3994,1.4022'

's3 = Time,Voltage_0,Med_PSense,FC_Flow_Meter,Voltage_3,Voltage_4,Voltage_5,Voltage_6,Voltage_7
0.0000,0.2223,-0.1762,-0.2465,1.4003,1.3993,1.4011,1.3918,1.3920
0.0100,0.2015,-0.1548,-0.2130,1.4054,1.3968,1.3910,1.3994,1.3996
0.0200,0.2535,-0.0691,-0.2465,1.3927,1.3993,1.4062,1.4020,1.4022
0.0300,0.2535,-0.1334,-0.2465,1.4003,1.3993,1.3986,1.3994,1.3920
0.0400,0.2119,-0.1120,-0.2381,1.4003,1.3993,1.4011,1.3994,1.4022'

给出的csv的长度是:

s1 = 9330 elements long
s2 = 9210 elements long
s3 = 6180 elements long

希望这有帮助!

1 个答案:

答案 0 :(得分:0)

输入文件: s1.csv,s2.csv,s3.csv

names = {'s1','s2','s3'};
delimiterIn = ',';
headerlinesIn = 1;

% make a structure with all data
for i = 1:length(names)
    all.data(i) = importdata([char(names(i)),'.csv'],delimiterIn ,headerlinesIn)
end

% take columns 1,3,4 (from s1)
all.data(1).data(:,[1,3,4])
% take columns 1,3,4 (from s2)
all.data(2).data(:,[1,3,4])
% ...

这个选择可以循环实现...... 而且,还有什么需要做的呢?