Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
ВнизСортировка строк Найти похожие ветки
← →
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 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c