我的查询分为两部分:
1)我有多个.xlsx文件存储在一个文件夹中,总共1年的价值(~365 .xlsx文件)。它们根据日期命名:' A_ddmmmyyyy.xlsx '(例如A_01Jan2016.xlsx)。每个.xlsx都有 5列数据:日期,数量,纬度,经度,度量。问题是,每个.xlsx文件包含大约400,000行数据,虽然我在Excel中有脚本来合并它们,但Excel中固有的行限制阻止我将所有数据合并在一起。
(i)有没有办法递归地读取每个.xlsx工作表中的数据到MATLAB中,并在MATLAB中指定每列(变量)的变量名称(即日期,数量等)(没有列标题) .xlsx文件)?
(ii)如何将每个.xlsx中每列的数据合并在一起?
谢谢 杰弗逊
答案 0 :(得分:0)
让我们按部分来看
首先我不建议将所有文件数据加入一列,不需要将这些信息全部放在一起,您可以单独使用它,例如使用数据存储区
在mya目录中的matlab中工作:
>> pwd
ans =
/home/anquegi/learn/matlab/stackoverflow
我有一个文件夹,其中包含两个示例excel文件:
>> ls
20_hz.jpg big_data_store_analysis.m excel_files octave-workspace sample-file.log
40_hz.jpg chirp_signals.m NewCode.m sample.csv
>> ls excel_files/
A_01Jan2016.xlsx A_02Jan2016.xlsx
每个文件的内容是:
Date Quantity Latitude Longitude Measurement
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
9 9 9 9 9
10 10 10 10 10
11 11 11 11 11
12 12 12 12 12
13 13 13 13 13
14 14 14 14 14
15 15 15 15 15
16 16 16 16 16
17 17 17 17 17
18 18 18 18 18
19 19 19 19 19
20 20 20 20 20
21 21 21 21 21
22 22 22 22 22
只知道它将如何运作。
阅读数据:
>> ssds = spreadsheetDatastore('./excel_files')
ssds =
SpreadsheetDatastore with properties:
Files: {
'/home/anquegi/learn/matlab/stackoverflow/excel_files/A_01Jan2016.xlsx';
'/home/anquegi/learn/matlab/stackoverflow/excel_files/A_02Jan2016.xlsx'
}
Sheets: ''
Range: ''
Sheet Format Properties:
NumHeaderLines: 0
ReadVariableNames: true
VariableNames: {'Date', 'Quantity', 'Latitude' ... and 2 more}
VariableTypes: {'double', 'double', 'double' ... and 2 more}
Properties that control the table returned by preview, read, readall:
SelectedVariableNames: {'Date', 'Quantity', 'Latitude' ... and 2 more}
SelectedVariableTypes: {'double', 'double', 'double' ... and 2 more}
ReadSize: 'file'
现在,您拥有表中的所有数据,让我们看到预览
>> data = preview(ssds)
data =
Date Quantity Latitude Longitude Measurement
____ ________ ________ _________ ___________
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
预览是获取样本数据的好点。
您不需要合并,您可以完成所有元素:
>> ssds.VariableNames
ans =
'Date' 'Quantity' 'Latitude' 'Longitude' 'Measurement'
>> ssds.VariableTypes
ans =
'double' 'double' 'double' 'double' 'double'
% let's get all the Latitude elements that have Date equal 1, in this case the tow files are the same, so we wil get two elements with value 1
>> reset(ssds)
accum = [];
while hasdata(ssds)
T = read(ssds);
accum(end +1) = T(T.Date == 1,:).Latitude;
end
>> accum
accum =
1 1
因此,您需要使用数据存储区和表,有点棘手但非常有用,您还希望控制数据存储区对象中的读取和其他变量。但这是在matlab中处理大数据文件的好方法
对于旧版本的matlab,您可以使用更传统的近似值:
folder='./excel_files';
filetype='*.xlsx';
f=fullfile(folder,filetype);
d=dir(f);
for k=1:numel(d);
data{k}=xlsread(fullfile(folder,d(k).name));
end
现在您将数据存储在数据
中folder='./excel_files';
filetype='*.xlsx';
f=fullfile(folder,filetype);
d=dir(f);
for k=1:numel(d);
data{k}=xlsread(fullfile(folder,d(k).name));
end
data
data =
[22x5 double] [22x5 double]
数据{1}
ans =
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
9 9 9 9 9
10 10 10 10 10
11 11 11 11 11
12 12 12 12 12
13 13 13 13 13
14 14 14 14 14
15 15 15 15 15
16 16 16 16 16
17 17 17 17 17
18 18 18 18 18
19 19 19 19 19
20 20 20 20 20
21 21 21 21 21
22 22 22 22 22
但要注意很多大文件