我有一个文件夹,里面的文件名称相似,但编号不同:
P_Coord = 'C:Coordinatescoor2.dom.txt';'C:Coordinatescoor3.dom.txt';..etc until 100.
我从列表中得到一个数字CaseNo,它等于文件名中的一个数字。
我想在文件夹中的文件名中搜索CaseNo,当它找到带有该数字的文件名时,从该文件中提取第2和第3列值(坐标),其中row.name等于noon。
例如,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)
%我想我需要使用regexp,但不确定如何使其工作
CaseNo = regexp (fileCoor(i).name,'Coor(d*).dom.txt');
%extract第二、三列
CaseCoor [x][y] = fileCoor (2;midday),(3;midday)
我不太熟悉Matlab,花了很长时间才弄清楚如何实现它。任何帮助将非常感激!
这就是这些文本文件的样子(我需要采取2&3 col的row midday):
morning -13.451536 -52.025423 -1.043887
Bd 3.222905 6.761101 -69.551082
...
midday 31.112678 -84.673258 -47.892980
谢谢,米拉
使用num2str函数如何?
fileName= ['Coor',num2str(CaseNo),'.com.txt');
然后用strcmp函数比较变量fileName与文件夹中的所有文件。
如果您想了解更多细节,请查看matlab帮助中的以下函数:num2str, strcmp
如果您的文件有一套命名系统,例如:"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路径)。
一旦有了文件名,有几种方法可以读取该数据。这取决于你没有提到的数据的某些方面(行'midday'总是在文件中的相同位置,所有文件都包含行'midday',行内容是否一致),这是解决它的最佳方法。
例如:您可以使用fopen
打开文件,使用fgetl
读取单独的行,直到找到以midday
开头的行,然后从行中提取这些值。(在我看来)这是不优雅的,但可以在广泛的数据格式上工作,例如,即使行内容不一致,您也可以使用它。
否则,如果所有行都包含一个字符串和三个数字,如您在示例中所示,并且文件不是过大,我的偏好是使用textscan
和适当的格式字符串(例如'%s%f%f%f'
)来拉入整个文件,检查字符串'midday'的第一列(使用strfind
, strcmp
等)以找到正确的行,然后从列2和3中提取适当的数据。
如果您有最新版本的MATLAB, readtable
也是一个选项,可以自动处理行名。
我之前的答案是错误的,所以我做了下面的事情:
>>P_Coord = 'C:Coordinatescoor2212.dom.txt'
你只想从这个字符串中得到数字,对吗?
>>CaseNo = regexp (P_Coord,'d+','match')
CaseNo =
'2212'
我得到了你想要的答案。如果你的字符串中碰巧有另一个数字(例如'C:Coordinates2coor2212.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"
应该能行