Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

Как найти фрагмент текста (дата)?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.017 c
15-1216204880
DVM
2008-07-16 14:41
2008.09.07
Вопрос к тем кто живет на Украине или ездил туда недавно.


3-1205222693
Julia
2008-03-11 11:04
2008.09.07
HalcyonDataSet


15-1216216618
Loginov Dmitry
2008-07-16 17:56
2008.09.07
Задачка


15-1216043557
Украинец
2008-07-14 17:52
2008.09.07
Научитесь программировать за десять лет(л)


15-1216364300
shlst
2008-07-18 10:58
2008.09.07
Касперски против Intel!