Вниз
Скачать: CL | DM;

Сортировка строк   Найти похожие ветки 

← →
SHS   (2004-02-17 09:27) [0]

В Memo загружаю текстовый файл, каждая строка которого начинается с даты и выглядит примерно так: "15.01 Здесь любой текст". Мне нужно отсортировать эти строки в Memo по датам. Примерно знаю, что первые пять символов строки нужно преобразовать в тип TDate и потом сравнивать с другими строками, но практически никак сделать не получается, если кто-нибудь поможет конкретным примером, буду очень благодарен.


← →
ЮЮ ©   (2004-02-17 09:39) [1]

Преобразовать в "01.15 Здесь любой текст" и засунуть в StringList c Sorted = true. В конце получаем отсортированный список строк, делаем Assign и ... всё


← →
ЮЮ ©   (2004-02-17 09:40) [2]

>в Memo загружаю текстовый файл

загружай в StringList в отключенной сортировкой, преобразуй, сделай сортировку


← →
kostik78ua   (2004-02-17 09:46) [3]

Например что-то типа такого:
procedure TForm1.Button1Click(Sender: TObject);
var
st: TStringlist;
begin
st := TStringlist.Create;
try
st.CommaText := Memo1.Lines.CommaText;
st.Sorted := True;
Memo1.Lines.CommaText := st.CommaText;
finally
FreeAndNil(st);
end;
end;
Или использовать st.Sort


← →
SHS   (2004-02-17 09:53) [4]

To ЮЮ ©: Со StringList я пробовал, там получалось так:
10.02 ...
10.03 ...
10.04 ...
11.01 ...
11.02 ...
11.03 ...
т.е даты шли правильно, а вот месяца нет.

To kostik78ua:
Сейчас попробую.


← →
SHS   (2004-02-17 10:02) [5]

To kostik78ua: сортируется только по дате, без учёта месяца...


← →
mrcat ©   (2004-02-17 10:08) [6]

>SHS (17.02.04 09:53) [4]
>т.е даты шли правильно, а вот месяца нет.

ЮЮ © (17.02.04 09:39) [1]
Преобразовать в " 01.15 Здесь любой текст"


← →
Babay ©   (2004-02-17 10:14) [7]

1) заводим например запись
Type TmDateText=Record;
date:TDate;
Text:String;
end;
2) Заводим динамический массив типа TmDateText
3) Читаем в стринглист файл
4) Перекладываем из стринглист в массив с разборкой соответственно даты и строки
5) Сортируем массив по Date используя ее как Double
6) Вываливаем из массива в мемо с обратным преобразованиее даты и строки
по идее должно работать


← →
FOX ©   (2004-02-17 12:46) [8]

Один из возможных вариантов:

function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
var d1, d2: TDate;
begin
d1 := EncodeDate( 1,
StrToInt(copy(List[Index1], 4, 2)),
StrToInt(copy(List[Index1], 1, 2)));
d2 := EncodeDate( 1,
StrToInt(copy(List[Index2], 4, 2)),
StrToInt(copy(List[Index2], 1, 2)));
if d1 < d2 then result := -1
else
if d1 > d2 then result := 1
else result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var r: TStringList;
begin
r := TStringList.Create;
try
r.Assign(Memo1.Lines);
r.CustomSort(@MyCompare);
Memo1.Lines.Assign(r);
finally
r.Free;
end;
end;


← →
SHS   (2004-02-17 13:13) [9]

Спасибо всем ОГРОМНОЕ за помощь!

Метод предложенный ЮЮ © конечно работает:
Преобразовать в "mm.dd Здесь любой текст"
(в оригинале "dd.mm Здесь любой текст"), спасибо mrcat ©, что заострил моё внимание на этом.

Ещё раз ВСЕМ Большое спасибо, ещё вариант FOX © сейчас обязательно попробую.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.017 c
14-94185
slivka
2004-02-06 23:20
2004.02.29
А что такое


1-93900
Cardinal
2004-02-15 14:51
2004.02.29
Как писать в шеснадцатеричный файл??


14-94145
127.0.0.1
2004-02-08 17:20
2004.02.29
Посмотри и улыбнись ;)


1-93868
Гиричев Руслан
2004-02-15 21:15
2004.02.29
Курсор - кажется что в нём такого, а...


7-94222
Sam Stone
2003-12-11 21:03
2004.02.29
Файлы из кэша IE




   Наверх