Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

регистр букв [D7, dBase, FoxPro, Paradox]


Страницы:   1 2

rosl ©   (2006-02-14 02:55:00) 

народ. принимаю некий список в свою базу из файла dbf
у меня поле в name фио клиентов через пробел, т.е. Иванов Иван Иванович. А в файле для загрузки (сформированном в др. программе) фио без разделителей - ИвановИванИванович. Есть правда регистр букв. имена, фамилии и отчества с большой буквы. как бы проставить между ними пробелы?


rosl   (2006-02-15 01:51:00) [1]

спасибо всем. восполььзовался StringReplace. всё работает.


Johnmen   (2006-02-14 23:28:00) [2]

>atruhin ©   (14.02.06 19:00) [19]

Думаешь неправильно. Будем спорить...:)
Завтра. Сейчас спать...


atruhin   (2006-02-14 19:00:00) [3]

>>но всё же медленнее, чем гонять байты оптом, а не по одному...:)
Думаю в зависимости от длинны отдельных слов, если слова длиные то согласен, при средней длинне 5-9 байт (имя/фамилия) готов спорить. :) Думаю накладные расходы на move, с учетом ее анализа длинны буфера, наложения буфера, инкрементного/декрементного переноса, переноса по несколько байт будут гораздо больше чем перенос этих байт.
PS. А ошибки, писал прямо здесь, держа в одной руке бокал с вином. :)


Johnmen   (2006-02-14 16:24:00) [4]

>atruhin ©   (14.02.06 16:04) [17]

Опуская ошибки и глядя только на суть, можно сказать, что это будет быстро, но всё же медленнее, чем гонять байты оптом, а не по одному...:)


atruhin   (2006-02-14 16:04:00) [5]

>>"Да не согласен я!" (с)
Хорошо! Проще, проще и вполне подходит! :)
Хотя я бы сделал так:                  

GetMem( ptr, Length(Str)*2 );
FillChar(Ptr[0],Length(Str)*2, #32);
Len := 0;
for i := 1 to Length(Str) do begin
 inc(Len);
 if str[i] not in [ #128..#159,#240]
    then Ptr[Len]:=str[i];
end;
SetString(Result,ptr,len+1);
FreeMem( ptr );


Desdechado   (2006-02-14 15:48:00) [6]

чего спорите-то?
можно использовать уйму разных способов
я привел короткий и легко читаемый пример
на Си я бы написал совсем по-другому
каждому способу - свое место применения


umbra   (2006-02-14 15:00:00) [7]

2 Johnmen ©   (14.02.06 14:43) [12]

да, способы конечно разные. И способ из [5] наверное быстрее, поскольку его скорость не зависит от количества искомых символов, как у StringReplace


Johnmen   (2006-02-14 14:56:00) [8]


> Для данного примера [3] проще и лучше.


"Да не согласен я!" (с)


atruhin   (2006-02-14 14:51:00) [9]

Для данного примера [3] проще и лучше. Если брать большой текст, то [5] будет намного быстрее. Кодировка тут вообще ни причем. Если нужно с поддержкой кодировок то буфер или диапазон создаем динамически AnsiUpperCase('абв...эюя'), если нужно еще быстрее диапазон создаем 1 раз в момент запыска программы.


Johnmen   (2006-02-14 14:43:00) [10]

Только по результату в данном случае.
Но она это делает не так. В принципиальных моментах.


umbra   (2006-02-14 14:38:00) [11]

а в принципе StringReplaceи делает то, что описано в [5]


Johnmen   (2006-02-14 14:30:00) [12]

Причём тут кодировка вообще? Мы говорим про принцип.


umbra   (2006-02-14 14:25:00) [13]

2 atruhin ©   (14.02.06 14:19) [8]

в [5] указаны коды больших русских букв для кириллицы ДОС (СP866). Для кириллицы Виндовс нужен уже другой диапазон, для КОИ8 - третий и т.д.


atruhin   (2006-02-14 14:19:00) [14]

>>только для СP866
Во всех современных кодировках русские буквы "идут" постледовательно. Раньше была какая то кодировка где был разрыв, но это было давно и уже не правда :)


Johnmen   (2006-02-14 14:13:00) [15]


> umbra ©   (14.02.06 14:09) [6]
> только для СP866


А это что? :)
И почему быстрее?
И для чего не быстрее?


umbra   (2006-02-14 14:09:00) [16]

2 Johnmen ©   (14.02.06 13:55) [5]


> Ещё проще, и значительно быстрее
>

только для СP866


Johnmen   (2006-02-14 13:55:00) [17]

Ещё проще, и значительно быстрее

if s[i] in [ #128..#159,#240] then <запоминаем позицию>
...
<выделяем место под результат, место зачищаем>
<по всем позициям мувим куски в выделенное место>


umbra   (2006-02-14 13:52:00) [18]

точно. еще с одной функцией для строк познакомился :)


Desdechado   (2006-02-14 12:22:00) [19]

можно проще
function SplitByCapital(src: string): string;
const
delims = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯ';
var
i: Integer;
begin
result := src;
for i := 1 to Length( delims ) do
 result := StringReplace( result, delims[i], ' ' + delims[i] );
result := Trim( result );
end;


umbra   (2006-02-14 10:44:00) [20]


function SplitByCapital(src: string): string;
const
 delims = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯ';
var
 first, count, i: integer;

begin
 first := 1;
 for  i :=2 to Length(src) do
   begin
     if IsDelimiter(delims, src, i) then
      begin
        last := i - first;
        Result := MidStr(src, first, count) + ' ';
        first := i;
      end;
   end;
 SetLength(Result, Length(Result) - 1);  
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо