2013-11-19 4 views
1

У меня есть текстовый файл, содержащий несколько строк, каждый из которых состоит из строк и поплавков,Сортировка строк в файле по одному столбцу

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

В моей функции, мне нужно отсортировать эти строки по одному из плавает в одном столбце, скажем, переключать строку 2 для строки 1, если f2 < f1. Я знаю, что могу использовать

sort 

но я не знаю, как переносить остальную часть линии на новое место.

+0

Вы уже вытащили струны и поплавки в векторы Matlab? Или это часть вашей проблемы? –

+0

Нет, я могу извлечь данные из файла самостоятельно. –

ответ

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); 

Как и в вашем примере, столбцы ar е, ограниченное пробелом. Строки могут включать пробелы, если в текстовом файле используются двойные кавычки из-за спецификатора формата %q.

+1

Спасибо, это было очень полезно. –

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) 

Если у вас есть строки, структура данных может быть различным, и вы, возможно, придется использовать {} вместо(), чтобы заставить его работать

0

Для разбора строк и поплавки вы можете использовать textscan(fileid, '%s %s %s %f %f %f'). Он возвращает массив ячеек. Необходимая матрица данных float может быть сформирована с использованием последних трех ячеек массива ячеек.

Затем вы можете использовать sort(matrix, 2) для сортировки строк.

Если вы хотите переписать текстовый файл, перепишите на него обработанные данные. Для записи в файл, который вы можете использовать fprintf(fileid, '%s %s %s %f %f %f', elements_of_a_row)

Смежные вопросы