Matlab根据文件名查找文件并提取列



我有一个文件夹,里面的文件名称相似,但编号不同:

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"

应该能行

最新更新