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

Вниз

регистр букв   Найти похожие ветки 

 
rosl   (2006-02-14 02:55) [0]

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


 
Anatoly Podgoretsky ©   (2006-02-14 09:12) [1]

Дурдом какой то


 
umbra ©   (2006-02-14 10:44) [2]


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;


 
Desdechado ©   (2006-02-14 12:22) [3]

можно проще
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 13:52) [4]

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


 
Johnmen ©   (2006-02-14 13:55) [5]

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

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


 
umbra ©   (2006-02-14 14:09) [6]

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


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

только для СP866


 
Johnmen ©   (2006-02-14 14:13) [7]


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


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


 
atruhin ©   (2006-02-14 14:19) [8]

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


 
umbra ©   (2006-02-14 14:25) [9]

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

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


 
Johnmen ©   (2006-02-14 14:30) [10]

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


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

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


 
Johnmen ©   (2006-02-14 14:43) [12]

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


 
atruhin ©   (2006-02-14 14:51) [13]

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


 
Johnmen ©   (2006-02-14 14:56) [14]


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


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


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

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

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


 
Desdechado ©   (2006-02-14 15:48) [16]

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


 
atruhin ©   (2006-02-14 16:04) [17]

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

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 );


 
Johnmen ©   (2006-02-14 16:24) [18]

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

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


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

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


 
Johnmen ©   (2006-02-14 23:28) [20]

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.039 c
2-1143275526
Alex7
2006-03-25 11:32
2006.04.09
????????????


2-1142964079
Quattro
2006-03-21 21:01
2006.04.09
Окно-заставка


6-1135649722
vista
2005-12-27 05:15
2006.04.09
Аналог компонента TWebBrowse для Delphi?


3-1139687196
veb
2006-02-11 22:46
2006.04.09
Ограничения ADOTable.Filter


15-1142522188
jack128
2006-03-16 18:16
2006.04.09
Прикол на дельфи :-)