matlab根据文件名和提取列查找文件

时间:2014-03-26 11:28:07

标签: regex matlab

我有一个文件夹,其文件名称相似,文件名中包含不同的编号:

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

感谢, 米拉

3 个答案:

答案 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"

这应该可行:)