|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Разбитие текста на слова.
Есть текст в memo, нужно его разбить на слова и занести в массив каждое слово.
Делаю так: PHP код:
Не работает Чувствую что где-то напортачил в копировании каждой строки memo в переменную |
#2
|
||||
|
||||
можно так (примитивно, делал лет 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
|
||||
|
||||
Еще вариант...
Код:
//********************************************************* //Разбить строку на слова 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
|
||||
|
||||
странно, какие-то громоздкие коды...
Неужели строчку, например, "Я пользуюсь delphisources.ru" нельзя разделить на 3 слова и сохранить их, более проще? На худой конец, скажите где здесь ошибка: PHP код:
|
#5
|
||||
|
||||
раз надо мало кода то так
Код:
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
|
||||
|
||||
2 T-dayne
Все здорово))) Ну раздели при помощи твоего кода такую строку "Привет, как дела? Меня зовут Вася!" Понятно, когда пробелы все легко и просто, а если есть другие символы? В начале был Бит, потом Байт и только потом появилось Слово... |
#7
|
||||
|
||||
хорошо, с разбитием разобрались, а как быть, если разобрать нужно текст, введенный в мемо?
построчно присваивать текстовой переменной и ее обрабатывать? |
#8
|
||||
|
||||
Мемо это массив строк...
т.е. Memo.Lines[0] это первая строка и т.д... В начале был Бит, потом Байт и только потом появилось Слово... |
#9
|
||||
|
||||
Вот что у меня получилось, программа должна модифицировать текст, введеный в мемо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
|
||||
|
||||
Как я понял из вашего примера вы хотите сделать перевод текста, а не словарь. Тогда совершенно непонятно, зачем вам делать из текста словарь. Проще сразу заменять слова непосредственно в тексте.
Зачем-же вы считываете каждое слово из 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; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 26.02.2010 в 19:57. |
#11
|
||||
|
||||
Страдалецъ
Читается текст, и если слово содержится в заранее подготовленном словаре, заменить его. Это мне нужно. Теперь насчет чтения секциии, непойму что это даст и как использовать? |