【问题标题】:How to order (using an specific method) a .txt file using Matlab如何使用 Matlab 订购(使用特定方法).txt 文件
【发布时间】:2015-05-09 10:03:53
【问题描述】:

我正在尝试订购一个如下所示的 .txt 文件:

G1-G2-H2-I2
E1-E2-E3
D5-E5-F5
F8-F7
J4-K4
D8-D9
B9
H4
L13
C12
FIN

我试图获得的顺序是 A1>A2>B2 ... 等等,所以我试图按字母顺序排序,如果它们有相同的字母,那么我希望它们按数字排序。在我发布的示例中,您可以看到所有内容都正确排序,而不是包含以下内容的行:

F8-F7

什么时候应该:

F7-F8

如果 .txt 文件的第一行是:

H2-G2-I2-G1

应该改为:

G1-G2-H2-I2

完成所有这些更改后,我想创建一个新的 .txt 文件,其中包含正确的顺序并遵循相同的结构。

所以我设法通过将仅包含两对的行转换为数字(使用 ASCII)来对它们进行排序,但我真的不知道如何对其他行进行排序。

.txt 文件将始终具有相同的结构,这意味着:

第 1 行 → 4 对 第 2 行 → 3 对 第 3 行 → 3 对 第 4 行 → 2 对 第 5 行 → 2 对 第 6 行 → 2 对 第 7 行 → 1 对 第 8 行 → 1 对 第 9 行 → 1 对 第 10 行 → 1 对 第 11 行 → 始终包含 'FIN' 字符串

我正在尝试使用 Matlab 执行此操作,我安装了最新版本。

非常感谢您的帮助,我真的很感激。

【问题讨论】:

    标签: string matlab


    【解决方案1】:

    您可能想使用 the natsort toolbox 来满足您的需求。

    来自其文档:

    A = {'a2', 'a', 'a10', 'a1'}; 
    sort(A) 
    ans = {'a', 'a1', 'a10', 'a2'} 
    natsort(A) 
    ans = {'a', 'a1', 'a2', 'a10'}
    

    关于你的例子:

    >> natsort(strsplit('J9-K9-K10-L10', '-'))
    
    ans = 
    
    'J9'    'K9'    'K10'    'L10'
    
    >> 
    

    【讨论】:

      【解决方案2】:

      使用sort可以轻松完成排序,以下代码读取输入文件,对每一行进行排序并写入输出文件:

      function [] = sort_file(input_file_name, output_file_name)
      
      input = fopen(input_file_name, 'r');
      output = fopen(output_file_name, 'w');
      
      delimiter = '-';
      for k=1:10
          line = fgetl(input);
          split_line = strsplit(line,delimiter);
          % add leading zeros to ensure correct sorting
          split_line = regexprep(split_line, '^([A-Z])([0-9])$', '$10$2');
          sorted_line = sort(split_line);
          % remove leading zeros before writing the output
          sorted_line = regexprep(sorted_line, '^([A-Z])0([1-9])$', '$1$2');
          fprintf(output, '%s\n', strjoin(sorted_line,delimiter));
      end
      
      fwrite(output, 'FIN');
      
      fclose(input);
      fclose(output);
      
      end
      

      【讨论】:

      • 感谢您的快速响应,但是如果我放置这个 J9-K9-K10-L10,这将不起作用,它是这样订购的:J9-K10-K9-L10 但它应该是: J9-K9-K10-L10
      • @LunarParks:我更新了我的答案,它现在也适用于这些情况
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      相关资源
      最近更新 更多