Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.02.2010, 17:05
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию Разбитие текста на слова.

Есть текст в memo, нужно его разбить на слова и занести в массив каждое слово.
Делаю так:
PHP код:
str:=memo1.lines[0];
for 
i:=1 to 20 do
begin
p
:=pos(str,'');
arr[i]:=copy(str,1,p);
delete(str,p);
end
и так по циклу, по всем строчкам мемо.
Не работает
Чувствую что где-то напортачил в копировании каждой строки memo в переменную
Ответить с цитированием
  #2  
Старый 24.02.2010, 17:15
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

можно так (примитивно, делал лет 7 назад) (comma - разделитель, тоесть если надо по переносу строки, то разделитель будет #13)
Код:
function GetWords(comma,s: string): TStrings;
  function GetComma(comm,j: string): string;
  var
    a,p: integer;
    r,outstr: string;
  begin
    r := j;
    if r[1] = comma then Delete(r,1,1);
    p := Pos(comma,r);
    for a:=1 to p-1 do
    begin
      outstr := outstr + r[a];
    end;
  Result := outstr;
  end;
var
  l: string;
  a,f,b,z: integer;
begin
  b := 0;
  z := 0;
 
  l := s + comma;
  for f:=1 to Length(l) do
  begin
    if l[f] = comma then b := b + 1;
  end;

  while z < b do
  begin
    a := Pos(comma,l);
    Result.Add(GetComma(comma,l));
    Delete(l,1,a);
    Inc(z);
  end;
end;

а можно воспользоваться функцией WrapText (описание тут):
пример стопицот летней давности:
Код:
function WrapWords(s: string): string;
var
  a: integer;
  d: string;
begin
  d := WrapText(s, #13#10, ['.',' ',#9,'-'], 1);
  for a:=1 to Length(d) do
  begin
    if d[a] = ' ' then Delete(d,a,1);
  end;
Result := d;
end;

Последний раз редактировалось Ultras, 24.02.2010 в 17:33.
Ответить с цитированием
  #3  
Старый 24.02.2010, 17:36
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Еще вариант...
Код:
//*********************************************************
//Разбить строку на слова
Procedure TParser.pDevideStrOnWords(Str : String);
var
 CurPos, LengthStr  : byte;
 Ch : WideString;
 ListWords : TStringList;
begin
 ListWords := TStringList.Create;
//Преобразование всех разделительных знаков в пробелы
 Str:=StringReplace(Str,'.',' ',[rfReplaceAll]);
 Str:=StringReplace(Str,',',' ',[rfReplaceAll]);
 Str:=StringReplace(Str,'!',' ',[rfReplaceAll]);
 Str:=StringReplace(Str,'?',' ',[rfReplaceAll]);
//Удаление лишних пробелов
 CurPos := 0;
 LengthStr := Length(Str);
 repeat
  inc(CurPos);
  Ch := Copy(Str, CurPos ,1);
  if Ch = ' ' then 
  begin
   while Copy(Str, CurPos+1, 1) = ' ' do 
   begin
    Str := Copy(Str, 1, CurPos)+Copy(Str, CurPos+2, LengthStr-CurPos+1);
    Dec(LengthStr);
  end;
 end;
 until
  CurPos=Length(Str);
 //Форматировние пробелов в конец строк
 Str:=StringReplace(Str,' ',#13#10,[rfReplaceAll]);
 ListWords.text := Str;
end;
//*********************************************************
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #4  
Старый 25.02.2010, 15:08
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

странно, какие-то громоздкие коды...
Неужели строчку, например, "Я пользуюсь delphisources.ru" нельзя разделить на 3 слова и сохранить их, более проще?
На худой конец, скажите где здесь ошибка:
PHP код:
for i:=1 to 20 do 
begin 
p
:=pos(str,''); 
arr[i]:=copy(str,1,p); 
delete(str,p); 
end
Ответить с цитированием
  #5  
Старый 25.02.2010, 15:17
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

раз надо мало кода то так
Код:
var
str :TStringList;
s :string;
begin
s:='Я пользуюсь delphisources.ru';
str := TStringList.create;
str.text := stringReplace(s, ' ', #13#10, [rfReplaceAll]);
 str.SaveToFile('1.txt');
str.free;
end;
Ответить с цитированием
  #6  
Старый 25.02.2010, 15:46
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

2 T-dayne
Все здорово)))
Ну раздели при помощи твоего кода такую строку
"Привет, как дела? Меня зовут Вася!"
Понятно, когда пробелы все легко и просто, а если есть другие символы?
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #7  
Старый 26.02.2010, 15:37
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

хорошо, с разбитием разобрались, а как быть, если разобрать нужно текст, введенный в мемо?
построчно присваивать текстовой переменной и ее обрабатывать?
Ответить с цитированием
  #8  
Старый 26.02.2010, 17:11
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Мемо это массив строк...
т.е. Memo.Lines[0] это первая строка и т.д...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #9  
Старый 26.02.2010, 18:17
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

Вот что у меня получилось, программа должна модифицировать текст, введеный в мемо1 с помощью словаря settings.ini, и записать новый текст в мемо2. При компиляции ошибок нету, но при вводе слова и нажатии на кнопку вылетает с ошибкой.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
p,i,setarr: integer;
tmp, modif: string;
buf: tstringlist;
begin
setarr:=0;
buf:=tstringlist.Create;
for i:=0 to memo1.lines.Count-1 do
begin
//замена знаков на знаки с пробелами
tmp:=memo1.Lines[i];
tmp:=stringreplace(tmp,',',' ,',[rfReplaceAll]);
tmp:=stringreplace(tmp,'!',' !',[rfReplaceAll]);
tmp:=stringreplace(tmp,'?',' ?',[rfReplaceAll]);
tmp:=stringreplace(tmp,'.',' .',[rfReplaceAll]);
// начали разбиение на слова
while length(tmp)>0 do
begin
inc(setarr);// увеличиваем длину массива на 1
p:=pos(tmp,'');
SetLength(words,setarr);
words[i+1]:=copy(tmp,1,p);
delete(tmp,1,p);
end;
//заполнили массив словами и символами разделения
end;


//получаем измененные слова в строку
for i:=1 to setarr do
begin
modif:=modif+translate(words[i]);
end;

end;

function TForm1.translate(slovo: string): string; // функция перевода слов
var
changeword: string;
begin
tr:=tinifile.Create('settings.ini');
changeword:=tr.ReadString('translate', slovo, slovo); //ищем в словаре слово
result:=changeword;
end;

Если у кого-то есть время или желания, пожалуйста, помогите разобраться, 2й час бьюсь!

Последний раз редактировалось T-dayne, 26.02.2010 в 18:22.
Ответить с цитированием
  #10  
Старый 26.02.2010, 19:55
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Как я понял из вашего примера вы хотите сделать перевод текста, а не словарь. Тогда совершенно непонятно, зачем вам делать из текста словарь. Проще сразу заменять слова непосредственно в тексте.
Зачем-же вы считываете каждое слово из Ini. Считайте сразу всю секцию.
Вообще Ini-файл не самое удобное хранилище для словаря, но если уж так хочется, то вот вам небольшое усовершенстование стандартного класса TIniFile - писал как-то в похожей задаче.
Код:
  
Type 
  TSectionIniFile = array of record Key,Value: String end;
  THelperIniFile = class helper for TIniFile
    function ReadSectionIdentsAndValues(const Section: string): TSectionIniFile;
  end;

function THelperIniFile.ReadSectionIdentsAndValues(const Section: string): TSectionIniFile;
Var
  Strings: TStringList;
  i: Integer;
begin
 Strings := TStringList.Create;
 ReadSectionValues(Section, Strings);
 SetLength(Result,Strings.Count);
 for i := 0 to Length(Result)-1
 do begin
    Result[i].Key := Copy(Strings[i],1,Pos('=',Strings[i])-1);
    Result[i].Value := Copy(Strings[i],Pos('=',Strings[i])+1);
    end;
end;
Поместите этот код в тело программы и стандартный клас TIniFile получит дополнительный метод ReadSectionIdentsAndValues
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 26.02.2010 в 19:57.
Ответить с цитированием
  #11  
Старый 26.02.2010, 20:19
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

Страдалецъ
Читается текст, и если слово содержится в заранее подготовленном словаре, заменить его. Это мне нужно.
Теперь насчет чтения секциии, непойму что это даст и как использовать?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter