Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
2-1217069073
agress0r
2008-07-26 14:44
2008.09.07
Прога вылетает при подключениие dll в vista


2-1217323341
Cobalt
2008-07-29 13:22
2008.09.07
AV при работе с TStringList


15-1216034230
oldman
2008-07-14 15:17
2008.09.07
Как в ХР увидеть содержимое корневого каталога С?


1-1198217550
андр
2007-12-21 09:12
2008.09.07
DataSet to DLL


2-1217144058
krem
2008-07-27 11:34
2008.09.07
динамический массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский