Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Matlab对文件中的多行进行排序_Matlab_Sorting_Row_Cell - Fatal编程技术网

使用Matlab对文件中的多行进行排序

使用Matlab对文件中的多行进行排序,matlab,sorting,row,cell,Matlab,Sorting,Row,Cell,我有一个文件,其总列数如下: 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

我有一个文件,其总列数如下:

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列和第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?

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

  • 将文本作为一个长字符串阅读:

    A=[。。。
    “1.000000-1.000200 0->2 A-MPDU 1.000000-1.000100成功1.000100-1.000200失败”。。。
    字符(10)'1.000225-1.000270 2->0确认成功[01]'。。。
    字符(10)“1.000150-1.000350 1->3 A-MPDU 1.000150-1.000250故障1.000250-1.000350故障”。。。
    字符(10)“1.000425 1超时”。。。
    字符(10)‘1.000270-1.000570 0 0退避’。。。
    ];

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

  • 使用:
    B=(strsplit(A,char(10)))将长字符串拆分为单独的单元格

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

  • 通过:
    
    D=C;
    对于ind1=1:长度(D)
    tmp=长度(D{ind1});
    D(ind1,1:tmp)=D{ind1};
    结束

  • 在第2列中查找结果包含数字的行:

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

  • 通过以下方式创建索引列表:
    
    idx(ind1,1)=0;%预分配
    对于ind1=1:ind1%极端变量重用
    idx(ind1)=str2double(D(ind1,4-2*isInd(ind1));
    结束

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

  • 使用此代码的结果是一个排序的单元格数组



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

    您已经问过如何读取文件:在这个问题中不需要再次解决此问题。我建议将分析的数据添加到问题中,并添加/链接您正在使用的代码来读取文件。当第四\第二列中的数字相同时,如何决定应该先行?如果可能的话,考虑将文件的格式更改为易于解析的东西(如XML或JSON),谢谢您,它解释得很好。