2015-07-20 189 views
1

我有大约50个文件充满了数据行。我想要做的是有一个程序可以打开文件,读取文件的第8行,然后根据第8行对文件进行排序。第8行代表经度。在Matlab中排序文件

所以最低经度的文件是第一位的。我试图用fget函数徒劳无功,我认为这是不可能的。我之前发布过这个,但是我删除了它,因为我在标记时犯了一个错误。

一个什么样的文件看起来像如下所示的例子:第一

1 Cruise_Number: 2006002 
    2 Cruise_Name: ARCTICNET 0602 
    3 Original_Filename: CTD_2006002_016_1_DN.ODF 
    4 Station : Station BA04 
    5 Cast_Number : 016 
    6 Start_Date_Time [UTC]: 07-SEP-2006 02:05:00.00 
    7 Initial_Latitude [deg]: 75.277 
    8 Initial_Longitude [deg]: -74.9482 
    9 Sounding [m]: 489 
    10 Min_Depth [m]: 7.27 
    11 Max_Depth [m]: 462.57 

回答

3

第一件事,你应该使用dirfullfile读取所有文件的文件夹/目录。 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为你有很多文件。


祝你好运!