![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как найти фрагмент текста (дата)?
Newser © (2008-07-27 12:16:00)Дата может быть написана:
1.06.08
11.06.08
KilkennyCat (2008-07-28 21:38:00) [1]Выше написано.
Я вот чего не понимаю... использование ADO, на мой взгляд, довольно-таки неплохой уровень...
Newser (2008-07-28 20:51:00) [2]Как организовать проверку, используя - '\d{1,2}\.\d{2}\.\d{2}' ?
Newser (2008-07-28 20:49:00) [3]Спасибо, Юрий Зотов !
Всё гениальное - просто ;-)
Потом я думаю сделать:
i2:=1;
while i2 < L.Count do
begin
"поле дата" := L[i2]
"поле работа" := L[i2+1]
"поле текст" := L[i2+2]
i2:=i2+3;
end;
Чтобы придумать с проверкой...? - проверить что дата - это дата, иначе i2:=i2+3 и continue
Медвежонок Пятачок (2008-07-28 09:29:00) [4]with TRegExpr.Create do
try
Expression := '(\d{1,2})\.(\d{2})\.(\d{2})';
if Execute then
begin
ShowMessage('день ' + Match[1] + ' месяц ' + Match[2] + ' год ' + Match[3]);
end;
finally
Free;
end;
Юрий Зотов (2008-07-28 00:49:00) [5]> Newser (27.07.08 22:06) [22]
Вот работающая без ошибок, но все равно ОЧЕНЬ плохая программа. Почему она плохая - это Вы поймете, когда начнутся глюки (а они наверняка начнутся). Откуда эти глюки берутся и как от них избавиться - это уж Вы сами.
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Text := '01.02.08 - выезд для встречи. 02.02.08 - звонок для подтверждения. 03.02.08 - звонок, попросили перенести встречу на 04.02.08. 04.02.08 - выезд по плану.'
end;
const
WordChars = ['А'..'Я', 'а'..'я', '0'..'9'];
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
L: TStringList;
i: integer;
begin
S := Trim(StringReplace(Memo1.Text, '. ', #13#10, [rfReplaceAll]));
while not (S[Length(S)] in WordChars) do
SetLength(S, Length(S) - 1);
L := TStringList.Create;
try
L.BeginUpdate;
try
L.Text := StringReplace(S, ' - ', #13#10, [rfReplaceAll]);
i := 0;
while i < L.Count do
begin
Inc(i);
S := Copy(L[i], 1, Pos(' ', L[i]));
while not (S[Length(S)] in WordChars) do
SetLength(S, Length(S) - 1);
L.Insert(i, S);
Inc(i, 2)
end
finally
L.EndUpdate
end;
Memo1.Lines.Assign(L)
finally
L.Free
end
end;
palva (2008-07-28 00:14:00) [6]
> Подскажите хоть как индекс первого символа даты получить?
MatchPos, MatchLen
Newser (2008-07-27 22:06:00) [7]> Сергей М. © (27.07.08 18:51) [20]
Отчасти я понимаю! Но это всё - хождение вокруг, да около!
Подскажите хоть как индекс первого символа даты получить?
Правильный$Вася (2008-07-27 20:26:00) [8]
> Дата может быть написана: 1.06.08 11.06.08
я не понял - это написание одной и той жедаты?!
Сергей М. (2008-07-27 18:51:00) [9]
> 1. Мне нужно найти №п.п. символа, с которого начинается
> сообщение - это дата
При использовании TRegExpr налобность во всяких Pos отпадает напрочь - объект возвращает тебе готовую подстроку, содержащую искомое тобой, если оно действительно присутствует в ориг.строке.
См. св-во TRerExpr.Match[]
Anatoly Podgoretsky (2008-07-27 17:02:00) [10]> sniknik (27.07.2008 16:42:16) [16]
Какая разница, точка не точка, когда есть явный разделитель дата + " - ". Ну конечно при условии, что автор не ССЗБ
sniknik (2008-07-27 16:52:00) [11]не, динамики, хриплым потусторонним голосом... бипер в корпусе еще иногда поддакивает...
KilkennyCat (2008-07-27 16:44:00) [12]
> но чтото мне подсказывает
голоса из розетки? :)
sniknik (2008-07-27 16:42:00) [13]> 4. Точка (это разделитель!!!).
только не точка, а точка с пробелом -> ". ", просто точка есть и в датах, а дата в 3 предложении есть и как часть "хвоста".
а то можно в разборе и только от " - " плясать, начало предложение есть позиция " - " минус 8. конец - начало следующего или конец текста... тоже просто.
но чтото мне подсказывает, что автор ждет не объяснений как делать, а готового кода для копи-пасте...
Юрий Зотов (2008-07-27 16:31:00) [14]> Newser (27.07.08 16:12) [14]
Текст состоит из одинаковых элементов. Структура элемента такая:
1. Дата (и неважно, есть у нее впереди ноль, или нет).
2. Тире (это разделитель!!!).
3. Хвост.
4. Точка (это разделитель!!!).
Структура хвоста такая:
1. Первое слово хвоста.
2. Пробел (это разделитель!!!).
3. Остаток хвоста.
Вам нужно разложить элемент на три составляющие:
1. Дата.
2. Первое слово хвоста.
3. Хвост.
Задачка детская, надо только немного подумать. Все делается с помощью функций Pos (или PosEx), Copy, Trim... (см. в справке раздел "string handling routines").
Newser (2008-07-27 16:12:00) [15]Так поделитесь, пожалуйста, решением!
Anatoly Podgoretsky (2008-07-27 15:57:00) [16]> Newser (27.07.2008 15:23:10) [10]
Да элементарнейший же разбор
Любое предложение начинается с "дата - "
Newser (2008-07-27 15:43:00) [17]> Milk (27.07.08 15:32) [11]
Первоначальный текст в Memo!
Milk (2008-07-27 15:32:00) [18]Нужно отметить, что это довольно сильно отличается от [0]
> 1.06.08
> 11.06.08
ну и последний наводящий вопрос: где ищем?
БД, мемо или другой какой-либо контрол?
Newser (2008-07-27 15:23:00) [19]> KilkennyCat © (27.07.08 15:08) [9]
С помощью ADO передаю данные из одной БД в другую. Сложность с одним полем Memo, из одной записи:
"01.02.08 - выезд для встречи. 02.02.08 - звонок для подтверждения. 03.02.08 - звонок, попросили перенести встречу на 04.02.08. 04.02.08 - выезд по плану."
нужно раздельно получить, в конкретном случае 4 записи в новой БД:
1) "01.02.08"; "выезд"; "выезд для встречи."
2) "02.02.08"; "звонок"; "звонок для подтверждения."
3) "03.02.08"; "звонок"; "звонок, попросили перенести встречу на 04.02.08."
4) "04.02.08"; "выезд"; "выезд по плану."
Как это возможно сделать?
KilkennyCat (2008-07-27 15:08:00) [20]Вообще, мало данных сообщаете. Вполне возможно, что решение намного проще, особенно , если обрабатываете какой-то стандартный документ.
> Как в этом мне поможет компонент?
Возникает вопрос, а при чем здесь Делфи?...