从多个excel文件中提取特定数据,并从这些文件中创建单个矩阵
45次浏览(过去30天)
显示旧的注释
乔纳斯叫做
2021年8月31日
嗨,我在我的电脑上有一个接近1000个excel文件的文件,我不想手动从每个excel文件中手动提取第二行并合并成一个excel文件。
我想知道我如何在Matlab中做到这一点通过读取特定文件中的每个Excel文件并从第二行中取出所有列然后将所有这些组合成一个矩阵?
谢谢你的帮助
0评论
接受的答案
马修•诺伊
2021年8月31日
你好
这是一个示例,如果您想计算出整个文件夹
我假设它将是数值数据,所以我使用importdata(更快)
我还按自然顺序对文件名进行了排序,以防它们可能相关
即使你的文件有不同的大小(列数),它也能工作
clc
clearvars
fileDir = cd;
输出文件=“OUT.xlsx”;%输出文件名
fileNames = dir(fullfile(cd,‘* .xlsx‘));%获取目录中所有excel文件的列表
fileNames_sorted = natsortfiles({filenames_name});将文件名按顺序排序
M= length (fileNames_sorted);
为f = 1:M
%选项# 1仅用于使用importdata的数值数据
raw = importdata(fullfile(fileDir, fileNames_sorted{f}));
Second_row {f} = raw(2,:);%提取第二行
结束
将所有第二行写入一个矩阵并存储在excel文件中
writecell (second_row ', fullfile (cd,输出文件));
14日的评论
乔纳斯叫做
2021年8月31日
嗨,马修,我正在读取这个错误
未识别功能或
变量“second_row”。
输出错误(第26行)
writecell (second_row ', fullfile (cd,输出文件));
>>
我该怎么办?
谢谢
马修•诺伊
2021年8月31日
你好,乔纳斯
你能检查一下for循环是否正常吗?你从这一行得到输出吗?
当您键入时,工作区中将显示什么
生
?
raw = importdata(fullfile(fileDir, fileNames_sorted{f}));
乔纳斯叫做
2021年8月31日
- 18136a AS ABS BC.CSV
- 18136a深海控制AS ABS BC(自动).CSV
- 18136a深海控制
- 18136b AS ABS BC.CSV
- 18136b深海2%
- 18136c AS ABS BC.CSV
- 18136c深海2.5%.CSV
- 18136d AS ABS BC.CSV
- 18136d深海3%
- 18136e AS ABS BC.CSV
- 18136e深海3.5%
- 18136f AS ABS BC.CSV
- 18136f深海4%.CSV
- 18136g AS ABS BC.CSV
- 18136g深海4.5%。csv
- 18136h AS ABS BC.CSV
- 18136h深海5%。csv
- 18136i AS ABS BC.CSV
- 18136i深海6%
- 18136j AS ABS BC.CSV
- 18136j深海8%.CSV
- 18136k AS ABS BC.CSV
- 18136k深海10%
- ARTEMIS_SET_control_10%.xlsx
当然可以,我会寄给你一小文件夹的样品。我尝试过使用这个文件夹,它返回了一个名为OUT的excel文件,在excel文件中只有两个0。
在之前的测试中,我尝试使用一个包含1000个excel文件的文件夹,Matlab以某种方式打印了这个错误,可能是因为它太难处理了吧?
此外,如果是这种情况下,我可以创建多个较小的文件夹,然后将其合并到先前获得的输出矩阵,我将如何做到这一点?
谢谢
马修•诺伊
2021年9月1日
你好,再一次
我只是将您的一个数据文件(ARTEMIS_SET_control_10%.xlsx)从xlsx格式修改为CSV格式,因此它们都具有相同的格式。如果您需要挖掘CSV和XLSX文件的混合,我可以更新我的代码。
在那之后,我没有太多的事情要做,这段代码就像一个魅力,至少对于这批24个文件;
也见在我的代码的结尾,如果你希望有文件名也存储在OUT文件,附件供参考
稍微更新的代码:
clc
clearvars
fileDir = cd;
输出文件=“OUT.xlsx”;%输出文件名
fileNames = dir(fullfile(fileDir,‘* . csv‘));获取目录中的文件列表
fileNames_sorted = natsortfiles({filenames_name});%按顺序排序文件名(https://fr.mathworks.com/matlabcentral/fileexchange/47434-natural-order-filename-sort)
M= length (fileNames_sorted);
为f = 1:M
%选项# 1仅用于使用importdata的数值数据
raw = importdata(fullfile(fileDir, fileNames_sorted{f}));
Second_row {f} = raw(2,:);%提取第二行
结束
将所有第二行写入一个矩阵并存储在excel文件中
writecell (second_row ', fullfile (cd,输出文件));%,不包含文件名
% writecell([fileNames_sorted' second_row'],fullfile(cd,outfile));%,文件名存储在列1中
(对我来说,很多文件都有相同的数据,只是文件名不同)
乔纳斯叫做
2021年9月1日
对不起,这不是为我工作,所有的文件是不同的,但它只打印出401,0为每一列。
它应该做(2,:)从每个excel文件中复制第二行的所有内容,然后复制到一个excel文件或matlab中的矩阵中。由于这批处理中有24个excel文件,因此OUT矩阵应该有24行和936列
马修•诺伊
2021年9月1日
好吧,我相信我猜你真正想要的是什么-这不是我目前为止理解的
所以你想要第二列(而不是第二行!)每个数据文件的
然后ok,输出大小将是24行和936列
由于所有输入文件都具有相同的尺寸,我可以使代码更简单,并使用writematrix而不是writecell
代码如下:
clc
clearvars
fileDir = cd;
输出文件=“OUT.xlsx”;%输出文件名
fileNames = dir(fullfile(fileDir,‘* . csv‘));获取目录中的文件列表
fileNames_sorted = natsortfiles({filenames_name});%按顺序排序文件名(https://fr.mathworks.com/matlabcentral/fileexchange/47434-natural-order-filename-sort)
M= length (fileNames_sorted);
second_col = [];
为f = 1:M
%选项# 1仅用于使用importdata的数值数据
raw = importdata(fullfile(fileDir, fileNames_sorted{f}));
Second_col = [Second_col raw(:,2)];%提取第二列
结束
将所有第二列写入一个矩阵,并将其存储在excel文件中
writematrix (second_col fullfile (cd,输出文件);
乔纳斯叫做
2021年9月1日
对不起,我还有一个问题,我需要创建一个包含组名的{}单元格。
我需要创建一个5046x1单元格。其中有1682个点1,1682个点2,1682个点3。这是为了划分我的光谱,你想让我转发这篇文章,这样你就可以得到更多的选票了吗?
谢谢
乔纳斯叫做
2021年9月1日
更多答案(1)
我J
2021年8月31日
编辑:我J
2021年8月31日
你可以使用
readmatrix (
假设所有值都是数值,否则使用
readtable
)或
fileDatastore
读取这些文件。像这样的东西应该工作:
Myfiles = [“file1.xlsx”,“file2.xlsx”];%文件名:使用dir在目标目录内生成文件名
数据= [];
为I = 1: nummel (myfiles)
TAB = readmatrix(myfiles(i));%参见readmatrix获取更多选项
数据=[数据;选项卡(2)):;将所有文件的第二行聚合到一个新矩阵中
结束
13个评论
我J
2021年8月31日
这是可行的:
targetDir = pwd;%仅当文件在当前目录中
文件名=字符串({dir(fullfile(targetDir,‘* .xlsx‘) . name});%转换为字符串,在上面的例子中使用
我J
2021年8月31日
文件名和myfiles是相同的。你可以用我的例子:
targetDir = pwd;%仅当文件在当前目录中
myfiles = string({dir(fullfile(targetDir,‘* .xlsx‘)).name});data = [];
为I = 1: nummel (myfiles)
TAB = readmatrix(myfiles(i));%参见readmatrix获取更多选项
数据=[数据;选项卡(2)):;将所有文件的第二行聚合到一个新矩阵中
结束
% data是您试图从excel文件中生成的矩阵。
我J
2021年9月1日
是什么
输出
?没有变量叫做
输出
在我的片段中。我用了你的一些文件,它工作得很好:
targetDir = pwd;%仅当文件在当前目录中
myfiles = string({dir(fullfile(targetDir,‘* . csv‘)).name});data = [];你提到你有Excel文件,这是错误的。
为I = 1: nummel (myfiles)
TAB = readmatrix(myfiles(i));%参见readmatrix获取更多选项
数据=[数据;选项卡(2)):;将所有文件的第二行聚合到一个新矩阵中
结束
myfile =
"18136a AS ABS BC.CSV"
"18136c AS ABS BC.CSV"
"18136d深海3%.CSV"
"18136f AS ABS BC.CSV"
"18136g Deep Ocean 4.5%.CSV"
data =
401.1380 0
401.1380 0
401.1380 0
401.1380 0
401.1380 0
乔纳斯叫做
2021年9月1日
抱歉,我的意思是它只打印出一个2x5矩阵,401.1380和0,如数据所示。
例如,如果有25个包含红外光谱的excel文件,每个文件有2行和936列,那么它应该是一个25x936矩阵。第一行仅包含需要忽略的波数数据,第二行包含每个excel文件都不一样的吸收,需要提取并组合成最终矩阵。
我用这个来做主成分分析。
我J
2021年9月1日
它是5X2矩阵,因为首先,我只使用了5个CSV文件,其次,您的示例CSV文件只包含2列,所以它将是一个简单的5X2矩阵。
如果文件夹里有1000个文件,
myfile
是一个包含1000个CSV文件名的字符串数组。如果每个CSV文件也有936列,那么结果矩阵的大小将是1000X936。
注意这一行
myfiles = string({dir(fullfile(targetDir,‘* . csv‘) . name});
提取目标目录内的所有CSV文件(你的CSV文件所在文件夹的路径),所以不管那里有5个、1000个甚至更多的CSV文件,
myfile
仍然包含所有这些文件,然后将循环提取存在于第二行的值。
发生错误
由于对页面所做的更改,无法完成操作。重新加载页面以查看其更新状态。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。