我有一个文件夹,其文件名称相似,文件名中包含不同的编号:
P_Coord = 'C:\Coordinates\coor2.dom.txt';'C:\Coordinates\coor3.dom.txt';..etc until 100.
我从列表中得到一个数字CaseNo,它等于文件名中的一个数字。
我想在文件夹中的文件名中搜索CaseNo,当它找到带有该编号的文件名时,从该文件中提取第2和第3列值(坐标),其中row.name等于midday。
例如,CaseNo = 3需要文件' Coor3.com.txt'。 (还需要避免文件名38,31,31,33,13等)
fileCoor = dir('Coor*.com.txt');
for i = 1:numel(fileCoor)
if (CaseNo = fileCoor(i).name)
%我认为我需要使用正则表达式但不确定如何使其正常工作
CaseNo = regexp (fileCoor(i).name,'Coor(\d*).dom.txt');
%提取第2和第3列
CaseCoor [x][y] = fileCoor (2;midday),(3;midday)
我对Matlab不太熟悉,花了很长时间才弄明白如何实现它。任何帮助将不胜感激!
这就是那些文本文件的样子(我需要在中午拍摄2& 3 col):
morning -13.451536 -52.025423 -1.043887
Bd 3.222905 6.761101 -69.551082
...
midday 31.112678 -84.673258 -47.892980
感谢, 米拉
答案 0 :(得分:1)
使用num2str函数怎么样?
fileName= ['Coor',num2str(CaseNo),'.com.txt');
然后将变量fileName与文件夹中的所有文件与strcmp函数进行比较。
如果您需要更多详细信息,请检查matlab帮助中的以下函数:num2str,strcmp
答案 1 :(得分:1)
如果您的文件有一套设定的命名系统,例如" coor2.dom.txt",您只需使用sprintf
创建文件名,然后exist
检查文件名是否存在:
for n = 1:100
fname = sprintf('coor%d.dom.txt',n);
if exist(fname)
% then do stuff with this file
end
end
(注意:您可以添加sprintf
命令的完整路径;如果您不这样做,exist
将只查看MATLAB路径。
一旦有了文件名,有几种方法可以读取数据。这取决于您未提及的数据的某些方面(行和中午'总是在文件中的相同位置,所有文件都包含一行'正午',是行内容一致),这是解决它的最佳方式。
例如:
您可以使用fopen
打开文件,使用fgetl
读取各行,直到找到一个开始midday
的行,然后从行中提取这些值。这是(imo)不优雅的,但可以用于各种数据格式,例如即使行内容不一致,也可以使用它。
否则,如果您在示例中显示的所有行都包含一个字符串和三个数字,并且文件不是太大,我的偏好是使用textscan
和适当的格式字符串(例如{{1要拉出整个文件,检查第一列中的字符串' midday' (使用'%s%f%f%f'
,strfind
等)找到正确的行,然后从第2列和第3列中提取适当的数据。
如果您有最新版本的MATLAB,strcmp
也是一个选项,可以自动处理行名称。
答案 2 :(得分:0)
我之前的回答是错误的,所以我的所作所为:
>>P_Coord = 'C:\Coordinates\coor2212.dom.txt'
你想只得到这个字符串中的数字,对吧?
>>CaseNo = regexp (P_Coord,'\d+','match')
CaseNo =
'2212'
我得到你想要的答案。如果您的字符串中恰好有其他数字(例如' C:\ Coordinates2 \ coor2212.dom.txt',则您必须优化搜索。
关于仅使用早晨获取行,您还可以在表格中导入文件(如果您有最新版本的matlab):http://www.mathworks.fr/fr/help/matlab/ref/table.html
T = readtable(P_Coord,'ReadRowNames','true','Delimiter','\t') % Your delimiters are tabs, right?
%It will also consider first column as "row names"
MorningData = T({'morning'},2:3); %get data from column 2 and 3 for rows called "morning"
这应该可行:)