根据一列对文件中的行进行排序

时间:2013-11-19 21:01:56

标签: matlab

我有一个包含多行的文本文件,每行包含字符串和浮点数,

%s1 %s1 %s1 %f1 %f1 %f1
%s2 %s2 %s2 %f2 %f2 %f2

在我的函数中,我需要根据单个列中的一个浮点数对这些行进行排序,假设如果f2< F1。我知道我可以使用

sort

但我不知道如何把剩下的线路带到新的位置。

3 个答案:

答案 0 :(得分:1)

假设您有两个向量x1和x2。你想按x1排序。

[sorted_version_1, I] = sort(x1);
sorted_version_2 = x1(I);
% sorted_version_1 == sorted_version_2, both sorts of x2

sorted_x2 = x2(I)

如果您有字符串,则数据结构可能不同,您可能必须使用{}而不是()才能使其工作

答案 1 :(得分:0)

要解析字符串和浮点数,您可以使用textscan(fileid, '%s %s %s %f %f %f')。它返回一个单元格数组。您需要的浮点数据矩阵可以使用单元格数组的最后三个单元格形成。

然后,您可以使用sort(matrix, 2)对行进行排序。

如果要重写文本文件,则在其上覆盖已处理的数据。要写入文件,您可以使用fprintf(fileid, '%s %s %s %f %f %f', elements_of_a_row)

答案 2 :(得分:0)

sortrows函数旨在处理此问题并适用于单元格数组:

  

sortrows(X,COL)根据中指定的列对矩阵进行排序       向量COL

假设您将数据表T格式化为单元格。例如,这个随机数据:

>> T = [mat2cell(char(randi(26,4,3)+64),ones(4,1),ones(3,1)) num2cell(rand(4,3))]
T = 
    'W'    'M'    'D'    [0.5795]    [0.1008]    [0.1439]
    'Z'    'X'    'S'    [0.1030]    [0.5029]    [0.3192]
    'R'    'I'    'U'    [0.3553]    [0.4873]    [0.4491]
    'L'    'I'    'U'    [0.9389]    [0.7817]    [0.0499]

按照第4列按升序排序:

>> TSortedCol4 = sortrows(T,4)
TSortedCol4 = 
    'Z'    'X'    'S'    [0.1030]    [0.5029]    [0.3192]
    'R'    'I'    'U'    [0.3553]    [0.4873]    [0.4491]
    'W'    'M'    'D'    [0.5795]    [0.1008]    [0.1439]
    'L'    'I'    'U'    [0.9389]    [0.7817]    [0.0499]

如果您需要从文本文件中获取上述T格式的数据,可以执行以下操作来阅读并重新格式化:

fid = fopen('testtable.txt','r');
Tin = textscan(fid, '%q %q %q %f %f %f'); % each column has a cell
strcols=cellfun(@iscell,Tin);
T = [Tin{strcols} num2cell([Tin{~strcols}])]; % each item has a cell
fclose(fid);

如您的示例所示,列由空格分隔。如果由于%q格式说明符而在文本文件中使用双引号,则字符串可以包含空格。