Regex matlab根据文件名查找文件并提取列

Regex matlab根据文件名查找文件并提取列,regex,matlab,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

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

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等)

%我想我需要使用regexp,但不知道如何使它工作

CaseNo  = regexp (fileCoor(i).name,'Coor(\d*).dom.txt');
%提取第二列和第三列

CaseCoor [x][y] = fileCoor (2;midday),(3;midday)
我对Matlab不是很熟悉,花了很长时间才弄明白如何实现它。任何帮助都将不胜感激

这就是这些文本文件的外观(我需要在正午取2列和3列):

谢谢,
Mila

使用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
,然后从行中提取这些值。这是(imo)不美观的,但适用于多种数据格式,例如,即使行内容不一致,您也可以使用它

否则,如果所有行都包含一个字符串和三个数字,如您在示例中所示,并且文件不太大,则我倾向于使用带有适当格式字符串的
textscan
(例如
'%s%f%f'
)将整个文件拉入,检查第一列中的字符串“midday”(使用
strfind
strcmp
等)找到正确的行,然后从第2列和第3列中提取适当的数据


如果您有最新版本的MATLAB,
readtable
也是一个选项,可以自动处理行名称。

我以前的答案是错误的,所以我做了以下几点:

>>P_Coord = 'C:\Coordinates\coor2212.dom.txt'
您只想从这个字符串中获取数字,对吗

>>CaseNo  = regexp (P_Coord,'\d+','match')
CaseNo =
     '2212'
我得到了您想要的答案。如果您的字符串中碰巧有另一个数字(例如“C:\Coordinates 2\Coor212.dom.txt”),则必须优化搜索

关于仅在上午获取行,您还可以在表中导入文件(如果您有最新版本的matlab):


这应该行得通:)

勘误表:我再次更准确地阅读了您的问题。我提供的解决方案与您想要做的正好相反,对不起(我认为我不配得到我刚才得到的要点)。在您的情况下,您已经获得文件夹中的所有文件,但希望知道哪些数字存在。您是对的:regexp是解决方案。请查看regexp帮助,了解如何说出“一个或多个数字,前面有一个字符,后面有一个点”.乍一看,您给出的解决方案应该有效,我很惊讶它没有。如果您自己找不到,我会在有时间的时候给出更精确的答案。我使用的上面的regexp返回空单元格。caseNo=[]…我想这是我能找到的与description最接近的regexp.mil:我只是注意到有时你使用'c',有时使用'c',有时使用'dom',有时使用'com'。我试过你的代码,如果你的代码是一致的,它似乎可以工作。当我使用CaseNo=regexp(P_Coord(i).name,'Coor(\d*).dom.txt')时;我想知道它是否在文件名部分(\d*)中查找给定的数字CaseNo?您能将适用于您的代码发布到从文件中提取列的位置吗?谢谢“第二列和第三列”-你是指文件中的第二列和第三列?文件中有命名行和一组列?@nkjt是的,我用我拥有的文本文件示例编辑了上述描述。你确实需要阅读有关数据导入的MATLAB帮助,但我会给你一个开始。文件在那里。我读取了CaseNo。给定CaseNo=3,我需要找到一个文件'Coor3.comTxt’。给定的CaseNo=38我需要文件'COOR31.COM.TXT '。我不确定SaveTF会考虑这一点,这就是为什么我认为我可以使用ReGEXP。如何检查“CaseNo”是在文件名“COOR(\D*)”中,CaseNo应该等于\d*:CaseNo.ReExp(Py-COORD(i)。名称,'COOR(\D*).DOM.txt′)。;我建议您使用
sprintf
为每个案例编号创建适当的文件名,然后检查它是否存在,而不是试图从文件中删除案例编号。我甚至不明白您为什么要在这里尝试使用
regexp
。抱歉,我认为我没有清楚地解释我需要什么。我在我的Matlab提供了一个文本文件列表,而不仅仅是一个.P_Coor,只是用来解释.fileCoor=dir('Coor*.com.txt');然后我从系统中获取一个数字。我需要查看文件列表。在文件名中找到具有给定数字的文件。并从中提取2,3列。您只需加载我在您的答案中已经查找到的文件。我是新手,所以我没有真正得到您的答案。是的,您已经清楚地解释了。但我不打算建立一个rand列表om名称和数字。我不认为从单个字符串到字符串列表的步骤非常复杂。使用for循环和字符串单元格(保存坐标中所有文件的字符串单元格)
>>P_Coord = 'C:\Coordinates\coor2212.dom.txt'
>>CaseNo  = regexp (P_Coord,'\d+','match')
CaseNo =
     '2212'
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"