第一件事,你应该使用dir
和fullfile
读取所有文件的文件夹/目录。 dir
的输出将是表示目录中每个文件的信息结构。您使用fullfile
的原因是因为每个操作系统上文件夹/目录之间的路径分隔符不同。在Linux/Mac上,它在Windows上是/。为了与操作系统无关,请fullfile
为您建立目录的路径。
之后,使用for
循环遍历每个文件,打开它,执行处理并关闭文件。当你打开一个文件时,我会用fgetl
,然后调用它8次到第8行。 fgetl
将作为字符串在行中读取。接下来,我会在行尾使用regular expressions寻找一个数字,将这个数字表示为字符串转换为实际数字,然后将其放入数组中。
最后,您将有50个数字,因此对这些数字进行排序并获取相应的排序索引,然后重新排序从dir
输出的内容。
我打算假设您的所有文件都放在一个目录中。此外,假设所有的文件有.txt
扩展,做这样的事情:通过该行代码行
folder = fullfile('path', 'to', 'folder'); %// Replace where your files are here
files = dir(fullfile(folder, '*.txt')); %// Find all files in folder
longitude = zeros(numel(files), 1); %// Initialize longitude array
for idx = 1 : numel(files) %// For each file
fileID = fopen(fullfile(folder, files(idx).name)); %// Open up file
for idx2 = 1 : 8
str = fgetl(fileID); %// Skip to the 8th line
end
%// Extract out the number at the end of the string
numCell = regexp(str, '-?\d+\.\d+$', 'match');
%// Place into array
longitude(idx) = str2double(numCell{1});
%// Close file
fclose(fileID);
end
%// Sort the longitudes and get the index ordering
[~,ind] = sort(longitude);
%// Also reorder files in structure
files = files(ind);
让我们一步。您指定文件所在的第一行。每个子文件夹都以单个字符串分隔,所以在修改第一行代码时请记住这一点。第二行查找在该目录中具有.txt
扩展名的所有文件的列表。请记住,相对于输入目录dir
而言,文件名是,因此如果您仍想访问该文件,则需要再次使用fullfile
。接下来,我们创建一个数组来存储您从每个文件读入的经度。
接下来,我们遍历该目录中的每个文本文件,然后使用fopen
打开文件,然后使用fgetl
8次并跳过7行。第八行包含您感兴趣的文本。使用这一行,我们使用正则表达式来提取字符串末尾的数字。正则表达式是用于在文本中查找模式的机制。在你的情况下,你想要找到一个特定的模式 - 即前端可能有负值的浮点数。我们使用函数regexp
来帮助我们搜索模式。第一个输入是一个字符串,第二个输入是我们想要选择的模式。我们正在寻找的模式是非常模糊的一见钟情:
-?\d+\.\d+$
这是说,我们正在寻找一个数,其中可能可选有一个负号(-?)
后跟一个或多个数字的序列(\d+
),然后是小数点(\.
),然后是另一个数字序列(\d+
),我们确保发生这种情况发生在字符串($
)的末尾我们使用标志'match'
返回实际匹配的字符串。不这样做会返回位置找到了字符串,这不是我们想要的。返回的是一个单元格的字符串数组,如果这样做正确,则返回的单元格数组中只能有一个元素。我们只需访问该元素,通过str2double
将其转换为实际数字,然后将其记录到我们的经度数组中。
当我们完成循环时,我们对这些经度进行排序并提取索引排序。然后,我们使用此索引排序来重新排序从dir
返回的结构中的文件的名称以完成代码。 f
将包含参考longitude
排序顺序的文件名。我不确定你想在这之后做什么,所以我会留下这个答案。
但是,如果你想看到所有的排序顺序文件的列表,你可以很简单地做:
filesSorted = char(files.name);
这将打开所有文件名的名字,并把它们放入一个二维字符数组,其中每一行都是文件名。第一行是经度最小的文件名,第二行是第二小经度的文件名,依此类推。
您也可以将所有的名字在单元阵列由:
filesSorted = {files.name};
然后访问某个特定的文件名,这样做:
file = filesSorted{idx};
idx
是一个数字,从1为你有很多文件。
祝你好运!