【发布时间】:2017-09-29 18:32:50
【问题描述】:
我希望对数据导入有所帮助。作为背景,我测试了 30 种产品,每种产品 3 次,总共有 90 个独特的文件(分为三个)。
我的每个原始数据文件都有不同的行数,并且包含一个包含 9 列的标题行(我对标题不感兴趣)。在这种情况下,我只对获取第 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);
这会引入一个 单元格。 以下是我用来导入数据并将单元格转换为双精度的内容 - 正如您所看到的那样,这是相当费力的......有没有人有办法减少我正在做的复制粘贴量?
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 个矩阵中,你介意用零或 NaN 或其他东西填充不均匀的长度吗?
-
一点也不——最终我想取三个文件的平均值,并绘制时间(col.1)与压力(col4)和流量(col3)的关系。为了我的目的,我可以在同一轴上绘制压力和流量
-
你能给你的 .csv 文件吗?
-
我添加了一些原始数据的样本 - 它看起来不漂亮!欢迎您使用原始文件,但是,我不确定如何在此处上传。感谢您的帮助
-
首先,加载文件的循环无法简化,唯一的部分是您在每个单元格上调用的单个
cell2mat,可以使用cellfun之类的cell2mat(cellfun(@(x) cell2mat(x),C,'un',0))进行简化
标签: matlab data-import