Форум: "Базы";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];
Внизрегистр букв Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c