【问题标题】:Sorting multi rows from a file using Matlab使用 Matlab 对文件中的多行进行排序
【发布时间】:2014-07-20 05:04:11
【问题描述】:

我有一个包含不同总列数的文件,如下所示:

1.000000 - 1.000200 0 -> 2 A-MPDU 1.000000 - 1.000100 SUCCESS 1.000100 - 1.000200 FAIL
1.000225 - 1.000270 2 -> 0 ACK SUCCESS [01]
1.000150 - 1.000350 1 -> 3 A-MPDU 1.000150 - 1.000250 FAIL 1.000250 - 1.000350 FAIL
1.000425 1 TIMEOUT
1.000270 - 1.000570 0 BACKOFF

我想根据第 1 行、第 2、第 3、第 5 列和第 4 列第 2 列(换句话说,基于第 2 列或第 4 列)对这些行进行排序,因此排序后应该是这样的:

1.000000 - 1.000200 0 -> 2 A-MPDU 1.000000 - 1.000100 SUCCESS 1.000100 - 1.000200 FAIL
1.000270 - 1.000570 0 BACKOFF
1.000150 - 1.000350 1 -> 3 A-MPDU 1.000150 - 1.000250 FAIL 1.000250 - 1.000350 FAIL
1.000425 1 TIMEOUT
1.000225 - 1.000270 2 -> 0 ACK SUCCESS [01]

如何实现这个输出?我应该先计算每行的总列数来决定是使用 column2 还是 column4?

【问题讨论】:

  • 您已经问过如何在文件中读取:stackoverflow.com/questions/24825221/… 无需在此问题中再次解决此问题。我建议将解析后的数据添加到问题中,并添加/链接您用来读取文件的代码。
  • 当第4\2列的数字相同时,如何决定哪个先行?
  • 如果可能,考虑将文件格式更改为易于解析的格式(如 XML 或 Json)

标签: matlab sorting row cell


【解决方案1】:

看起来您的数据具有众所周知的结构。我能想到的最容易理解(但不一定最干净)的东西如下:

  1. 将文本读取为一个长字符串:

    A = [... '1.000000 - 1.000200 0 -> 2 A-MPDU 1.000000 - 1.000100 SUCCESS 1.000100 - 1.000200 FAIL'... char (10) '1.000225 - 1.000270 2 -> 0 ACK SUCCESS [01]'... char (10) '1.000150 - 1.000350 1 -> 3 A-MPDU 1.000150 - 1.000250 FAIL 1.000250 - 1.000350 FAIL'... char (10) '1.000425 1 TIMEOUT'... char (10) '1.000270 - 1.000570 0 BACKOFF'... ];

    注意:char(10) 是换行符\n。如果从文本文件中读取,您应该会自动获得此信息。

  2. 使用以下命令将长字符串拆分为单独的单元格:B=(strsplit(A,char(10)))';

  3. 使用C = cellfun(@strsplit,B,repmat({' '},size(B)),'UniformOutput',0); 将其转换为元胞数组(某些行末尾会包含空元胞,因为初始字符串的空格较少)。

  4. 将一维元胞数组的一维数组转换为单个二维数组: D=C; for ind1=1:length(D) tmp = length(D{ind1}); D(ind1,1:tmp)=D{ind1}; end

  5. 查找结果在第 2 列中有数字的行:

    isInd = ~strcmp('-',D(:,2))

  6. 通过以下方式创建索引列表: idx(ind1,1)=0; %Preallocation for ind1=1:ind1 %Extreme variable reuse idx(ind1) = str2double(D(ind1,4-2*isInd(ind1))); end

  7. 将索引附加到要排序的数组并根据它们排序: B1 = sortrows([B,num2cell(idx)],2); B_Sorted = B1(:,1);

使用此代码的结果是一个排序的元胞数组。


附:任何愿意优化此代码的人都非常欢迎编辑答案:)

【讨论】:

  • 谢谢,解释的很好
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2018-11-20
  • 2010-11-26
  • 2019-03-15
  • 2021-10-04
相关资源
最近更新 更多