Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
ВнизКак найти фрагмент текста (дата)? Найти похожие ветки
← →
Newser (2008-07-27 12:16) [0]Дата может быть написана:
1.06.08
11.06.08
← →
KilkennyCat © (2008-07-27 12:23) [1]Если необходимо найти что-то, что может быть описано двумя и более вариантами, то сначала ищем корень всех возможных вариантов, он и будет являтся условием поиска, после выполнения которого необходимо осуществить уже более подробное сравнение со всеми вариантами.
← →
Newser (2008-07-27 12:35) [2]> сначала ищем корень всех возможных вариантов
Ок! -
**.**.**
где первый символ - число, или пробел!
как найти такое?
← →
KilkennyCat © (2008-07-27 12:39) [3]Как компьютер компьютеру скажу - не вижу разницы, число или пробел.
> **.**.**
здесь корнем будут две точки между двумя символами.
← →
Поросенок Винни-Пух © (2008-07-27 12:47) [4]with TRegExpr.Create do
try
Expression := "\d{1,2}\.\d{2}\.\d{2}";
...
finally
Free;
end;
← →
Пётр_Ф (2008-07-27 13:05) [5]> Поросенок Винни-Пух © (27.07.08 12:47) [4]
Это компонент что-ли нужен какой-то?
← →
Newser (2008-07-27 13:14) [6]Да,... что-то не совсем понятно!
← →
Palladin © (2008-07-27 13:17) [7]1. pos,copy + F1
2. www.google.ru + TRegExp
вопросы?
← →
Newser (2008-07-27 14:17) [8]> Expression := "\d{1,2}\.\d{2}\.\d{2}";
Что это даёт? Если pos,copy... возвращают часть строки, номер символа... То тут... - непонятно! Expression - это маска... На сайте с компонентом по поводу маспи справка есть. Но как это использовать в Delphi ?
1. Мне нужно найти №п.п. символа, с которого начинается сообщение - это дата. Дата может состоять из 8 или 7 символов (в зависимости от дня). Перенести в поле "дата" новой БД... Как в этом мне поможет компонент?
2. через " - " после даты будет слово, которое мне нужно перенести в поле "текст", которое вообще может быть любой длинны...
как это реализовать с помощью TRegExp?
← →
KilkennyCat © (2008-07-27 15:08) [9]Вообще, мало данных сообщаете. Вполне возможно, что решение намного проще, особенно , если обрабатываете какой-то стандартный документ.
> Как в этом мне поможет компонент?
Возникает вопрос, а при чем здесь Делфи?...
← →
Newser (2008-07-27 15:23) [10]> 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"; "выезд"; "выезд по плану."
Как это возможно сделать?
← →
Milk (2008-07-27 15:32) [11]Нужно отметить, что это довольно сильно отличается от [0]
> 1.06.08
> 11.06.08
ну и последний наводящий вопрос: где ищем?
БД, мемо или другой какой-либо контрол?
← →
Newser (2008-07-27 15:43) [12]> Milk (27.07.08 15:32) [11]
Первоначальный текст в Memo!
← →
Anatoly Podgoretsky © (2008-07-27 15:57) [13]> Newser (27.07.2008 15:23:10) [10]
Да элементарнейший же разбор
Любое предложение начинается с "дата - "
← →
Newser (2008-07-27 16:12) [14]Так поделитесь, пожалуйста, решением!
← →
Юрий Зотов © (2008-07-27 16:31) [15]> Newser (27.07.08 16:12) [14]
Текст состоит из одинаковых элементов. Структура элемента такая:
1. Дата (и неважно, есть у нее впереди ноль, или нет).
2. Тире (это разделитель!!!).
3. Хвост.
4. Точка (это разделитель!!!).
Структура хвоста такая:
1. Первое слово хвоста.
2. Пробел (это разделитель!!!).
3. Остаток хвоста.
Вам нужно разложить элемент на три составляющие:
1. Дата.
2. Первое слово хвоста.
3. Хвост.
Задачка детская, надо только немного подумать. Все делается с помощью функций Pos (или PosEx), Copy, Trim... (см. в справке раздел "string handling routines").
← →
sniknik © (2008-07-27 16:42) [16]> 4. Точка (это разделитель!!!).
только не точка, а точка с пробелом -> ". ", просто точка есть и в датах, а дата в 3 предложении есть и как часть "хвоста".
а то можно в разборе и только от " - " плясать, начало предложение есть позиция " - " минус 8. конец - начало следующего или конец текста... тоже просто.
но чтото мне подсказывает, что автор ждет не объяснений как делать, а готового кода для копи-пасте...
← →
KilkennyCat © (2008-07-27 16:44) [17]
> но чтото мне подсказывает
голоса из розетки? :)
← →
sniknik © (2008-07-27 16:52) [18]не, динамики, хриплым потусторонним голосом... бипер в корпусе еще иногда поддакивает...
← →
Anatoly Podgoretsky © (2008-07-27 17:02) [19]> sniknik (27.07.2008 16:42:16) [16]
Какая разница, точка не точка, когда есть явный разделитель дата + " - ". Ну конечно при условии, что автор не ССЗБ
← →
Сергей М. © (2008-07-27 18:51) [20]
> 1. Мне нужно найти №п.п. символа, с которого начинается
> сообщение - это дата
При использовании TRegExpr налобность во всяких Pos отпадает напрочь - объект возвращает тебе готовую подстроку, содержащую искомое тобой, если оно действительно присутствует в ориг.строке.
См. св-во TRerExpr.Match[]
← →
Правильный$Вася (2008-07-27 20:26) [21]
> Дата может быть написана: 1.06.08 11.06.08
я не понял - это написание одной и той же даты?!
← →
Newser (2008-07-27 22:06) [22]> Сергей М. © (27.07.08 18:51) [20]
Отчасти я понимаю! Но это всё - хождение вокруг, да около!
Подскажите хоть как индекс первого символа даты получить?
← →
palva © (2008-07-28 00:14) [23]
> Подскажите хоть как индекс первого символа даты получить?
MatchPos, MatchLen
← →
Юрий Зотов © (2008-07-28 00:49) [24]> 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;
← →
Медвежонок Пятачок © (2008-07-28 09:29) [25]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;
← →
Newser (2008-07-28 20:49) [26]Спасибо, Юрий Зотов !
Всё гениальное - просто ;-)
Потом я думаю сделать:
i2:=1;
while i2 < L.Count do
begin
"поле дата" := L[i2]
"поле работа" := L[i2+1]
"поле текст" := L[i2+2]
i2:=i2+3;
end;
Чтобы придумать с проверкой...? - проверить что дата - это дата, иначе i2:=i2+3 и continue
← →
Newser (2008-07-28 20:51) [27]Как организовать проверку, используя - "\d{1,2}\.\d{2}\.\d{2}" ?
← →
KilkennyCat © (2008-07-28 21:38) [28]Выше написано.
Я вот чего не понимаю... использование ADO, на мой взгляд, довольно-таки неплохой уровень...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c