Matching multiple file names
显示 更早的评论
Hi
I have two types of data each in a seperate folder. Lets say I have magnetic field files in folder x and electric field files in folder y.
There are 365 magnetic field files each represnting one day of measurments. However electric field files are more than 365 and there are multiple files per day. For example, we have electric field files measured from 00:00:00 to 10:30:00 in one file for a day and then 11:00:00 to 23:59:59 in another file for the same day. Note that for some days there are more than two electric field files.
I want MATLAB to open magetic field file
"SW_OPER_MAGA_HR_1B_20140101T000000_20140101T235959_0505_MDR_MAG_HR_processed.mat" from it's folder
then open electric field files
"SW_EXPT_EFIA_TCT16_20140101T000000_20140101T103000_0302_processed.mat"
and
"SW_EXPT_EFIA_TCT16_20140101T110000_20140101T235959_0302_processed.mat"
which belong to the same day as magnetic field file as shown by data timestamp in file names. I was not succeful in using regexp and dir functions.
Thanks in advance,
Pouya.
采纳的回答
You'll have to fill in some of the blanks because I don't know how you're opening files, but to find the corresponding filenames in the electric field folder...
magstr = "SW_OPER_MAGA_HR_1B_20140101T000000_20140101T235959_0505_MDR_MAG_HR_processed.mat";
pat = "_" + digitsPattern(8) + "T";
thedates = extract(magstr,pat);
% eFieldNames = {dir().name};
eFieldNames = {'SW_EXPT_EFIA_TCT16_20140101T000000_20140101T103000_0302_processed.mat',
'SW_EXPT_EFIA_TCT16_20140102T110000_20140102T235959_0302_processed.mat',
'SW_EXPT_EFIA_TCT16_20140101T110000_20140101T235959_0302_processed.mat'};
filesToOpen = contains(eFieldFnames,thedates(1))
filesToOpen = 3×1 logical array
1
0
1
14 个评论
Hi Chris,
Thank you for a quick response.
filesToOpen succefully recognizes the files corresponding to the selected magnetic field file. How can I use the logical array (fielsToOpen) to actually open those chosen files?
By the way here is the small block of code that I have so far for your refrence:
clc
clear
path = 'C:\Users\pouya\OneDrive\Desktop\SW\Plasma\Processed\2014';
addpath 'C:\Users\pouya\OneDrive\Desktop\SW\Mag\Processed\2014\Alpha dB_e';
magstr = "SW_OPER_MAGA_HR_1B_20140101T000000_20140101T235959_0505_MDR_MAG_HR_processed.mat";
pat = "_" + digitsPattern(8) + "T";
thedates = extract(magstr,pat);
eFieldNames = {dir(path).name};
% eFieldFnames = {'SW_EXPT_EFIA_TCT16_20140101T000000_20140101T103000_0302_processed.mat',
% 'SW_EXPT_EFIA_TCT16_20140102T110000_20140102T235959_0302_processed.mat',
% 'SW_EXPT_EFIA_TCT16_20140101T110000_20140101T235959_0302_processed.mat'};
filesToOpen = contains(eFieldNames,thedates(1));
Regards,
Pouya.
I would probably cd(path), to get to the appropriate directory. I would also amend one of the previous commands:
filesToOpen = find(contains(eFieldNames,thedates(1)));
cd(path)
for idx = 1:numel(filesToOpen)
% May vary depending on how you open the file...
temp = readmatrix(eFieldNames(filesToOpen{idx}));
% Put the data somewhere more useful
allEfields{idx} = temp;
end
Do not use CD to access data files. Using CD is slow (it forces MATLAB to rescan the directories for MATLAB files), makes debugging harder, and is superfluous.
All MATLAB function that import/export data files accept absolute/relative filenames. Using relative/absolute filenames is easy and efficient. You should use absolute/relative filenames, for which FULLFILE is very useful.
Chris, Stefan,
Both return "Brace indexing is not supported for variables of this type." (when I replace cd with fullfile too)
Is there more to the error message?
Does the fully constructed path appear correct? You might put a breakpoint inside the for loop and inspect the filename you are trying to open/import.
Additionally, I would rename your "path" variable, as path() is a Matlab function that overlaps with the things you are trying to do here.
I can add that it refers to temp in the for loop. Basically:
Brace indexing is not supported for variables of this type.
Error in analysisstarttest (line 24)
temp = readmatrix(eFieldNames(filesToOpen{idx}));
(analysisstarttest is my script's name)
I suspect you're missing a backslash.
You can either insert a breakpoint, as I suggested, or display the filename before trying to open it:
disp("File Name: " + eFieldNames(filesToOpen{idx}))
Chris,
Thank you for continous help.
Unfortunatly now I am getting the same error but this time for disp
clc
clear
path = 'C:\Users\pouya\OneDrive\Desktop\SW\Plasma\Processed\2014\';
addpath ('C:\Users\pouya\OneDrive\Desktop\SW\Mag\Processed\2014\Alpha dB_e');
magstr = "SW_OPER_MAGA_HR_1B_20140102T000000_20140102T235959_0505_MDR_MAG_HR_processed.mat";
pat = "_" + digitsPattern(8) + "T";
thedates = extract(magstr,pat);
eFieldNames = {dir(path).name};
filesToOpen = find(contains(eFieldNames,thedates(1)));
% f=fullfile('processed','2014','filesToOpen');
cd(path)
for idx = 1:numel(filesToOpen)
% May vary depending on how you open the file...
disp("File Name: " + eFieldNames(filesToOpen{idx}));
% temp = readmatrix(eFieldNames(filesToOpen{idx}));
% % Put the data somewhere more useful
% allEfields{idx} = temp;
end
Which leads to:
Brace indexing is not supported for variables of this type.
Error in analysisstarttest (line 24)
disp("File Name: " + eFieldNames(filesToOpen{idx}));
I'm suspecting the problem is originating from eFieldNames = {dir(path).name};
eFieldNames has two elements at it's start that are "." and ".."
filesToOpen = find(contains(eFieldNames,thedates(1)));
will not indicate those two files, because the pattern you are looking for is not found there. The smallest index possible in filesToOpen should be 3.
@Pouya Pourkarim I just looked back at your most recent code. When you perform the dir() command, apparently you cannot have the trailing backslash.
I would reconstruct the full filenames like so:
pathn = 'C:\Users\pouya\OneDrive\Desktop\SW\Plasma\Processed\2014';
for (...)
% filesep is a Matlab command that generates the appropriate
% separator for your OS
% None of these are strings, so do char concatenation with []
f = [pathn, filesep, eFieldNames(filesToOpen{idx})];
disp("File Name: " + f)
end
Hi Chris
Unfortunatly the same error still presists and this time is
Brace indexing is not supported for variables of this type.
Error in analysisstarttest (line 24)
f=[path, filesep, eFieldNames(filesToOpen{idx})];
Let's think about it in a different way. I'm thinking I can do this process for mag files that have multiple E files manually and let the code do it only for mag files that have only one corresponding E files. If you come up with ideas I will be grateful for the help but I don't want to consume too much of your time now.
Regards,
Pouya.
@Pouya Pourkarim filesToOpen is a linear vector - a regular array that needs parentheses, not a cell array that needs braces. So whenever you see
filesToOpen{idx} % Won't work.
replace it with
filesToOpen(idx) % Should work.
Do NOT use path as the name of a variable since that's an important built in variable. Call it "folder" or something other than path.
Don't do this
f=[path, filesep, eFieldNames(filesToOpen{idx})];
Use fullfile() instead. And use descriptive variable names, otherwise your program will become an alphabet soup mess of cryptics one and two letter variables. And eFieldNames is a cell array so you need braces:
fullFileName = fullfile(folder, eFieldNames{filesToOpen(index)});
See the FAQ for a good discussion on where to use braces, brackets, or parentheses.
Thanks, it actually solved the problem with the Brace indexing error that I was getting.
更多回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 Characters and Strings 的更多信息
另请参阅
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
