Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Убрать лишние пробелы между словами  [new]
q1w1e1
Member

Откуда: Кы-рск
Сообщений: 1034
Сказали чтоб между словами был один пробел, а есть какая-нибудь функция, чтоб не разбирать значение поле по символьно...
а то функция strtran(expresion," "," "), может менять только заданное кол-во пробелов
15 окт 09, 08:48    [7788460]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
q1w1e1
Сказали чтоб между словами был один пробел, а есть какая-нибудь функция, чтоб не разбирать значение поле по символьно...
а то функция strtran(expresion," "," "), может менять только заданное кол-во пробелов


А написать на несколько строк кода больше рука не поднимается ?
Поле надо разбирать не посимвольно, а по словам функциями GETWORDCOUNT() и GETWORDNUM(). А разобрав, наверно, сумеется потом эти слова собрать в одну строку, вставив между ними по одному пробелу. Бином Ньютона...
15 окт 09, 09:01    [7788491]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
PARAMETERS victim
LOCAL vlen, i, res
vlen=GETWORDCOUNT(victim," ")
IF vlen=0
	RETURN ""
ENDIF
res=""
FOR i=1 TO vlen
	res=res+GETWORDNUM(victim, i, " ")+" "
NEXT
RETURN RTRIM(res)
15 окт 09, 09:12    [7788539]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
О Reduce
15 окт 09, 09:20    [7788562]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
q1w1e1
Member

Откуда: Кы-рск
Сообщений: 1034
Спасибо, а каким гаечным ключом всё это прикрутить к Select(у), типа select my_function(moy_stroka) as stoka from moy_table....
15 окт 09, 09:42    [7788646]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
проходящий.
Guest
q1w1e1
Спасибо, а каким гаечным ключом всё это прикрутить к Select(у), типа select my_function(moy_stroka) as stoka from moy_table....
Вот так и прикрутить. Просто вместо my_function написать reduce.
15 окт 09, 10:01    [7788758]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
q1w1e1
Member

Откуда: Кы-рск
Сообщений: 1034
не(и) фига...SELECT reduce(naim) FROM nomzen, выходит ошибка file 'reduce.prg does not exist'
15 окт 09, 10:30    [7788952]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
q1w1e1,
библиотеку подключить сначала нужно set library to ...
15 окт 09, 10:43    [7789099]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
Ещё пару способов. Если лень написать нормальную посимвольную функцию, то хотя бы так можно :)
do while "  "$cStr
   cStr = strtran(cStr,"  "," ")
enddo

Ну а если нужна скорость, в том числе для использования в запросах, то так
void far Reduce(ParamBlk FAR *parm)
{
    BYTE FAR *instr, FAR *outstr, chr;
    int i, len, flag = 1;

    _HLock(p0.ev_handle);                       // инициализация instr;
    len = p0.ev_length;
    instr = _HandToPtr(p0.ev_handle);
    outstr = instr - 1;

    for (i=0; i<len; i++) {     // удаление лидирующих и избыточных пробелов;
        chr = *(instr+i);
        if (chr!=' ' || !flag) *(++outstr) = chr;
        flag = (chr==' ');
    }
                                            // удаление завершающих пробелов;
    while (outstr>=instr && *outstr==' ') outstr--;
    len = outstr - instr + 1;

    if (p0.ev_length!=(unsigned int)len) {                // возврат результата;
       if (!_SetHandSize(p0.ev_handle, len)) _Error(OutMemory);
       p0.ev_length = len;
    }
    _RetVal(&p0);
    _HUnLock(p0.ev_handle);
}
15 окт 09, 10:44    [7789107]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
q1w1e1
Member

Откуда: Кы-рск
Сообщений: 1034
Мне очень понравился последний вариант, я думаю, если мне удастся это прикрутить, то рейтинг в отделе у меня повысится(среди слепых и одноглазый король)...:-), и весь отдел будет привязан ко мне, как к гуру, так как изменить и понять этого никто не сможет(в том числе и я) :-)), только как и где мне откомпилить этот сишный код, и самое главное как из него сделать библиотеку, чтоб потом можно было написать, как мне заметли "Set Library to" :-)
15 окт 09, 11:03    [7789320]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
q1w1e1
"Set Library to" :-)

В коде по ссылке всё уже показано
15 окт 09, 13:23    [7790685]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
Dag
Member

Откуда:
Сообщений: 842
>>только как и где мне откомпилить этот сишный код, и самое главное как из него сделать библиотеку

Зри в корень
15 окт 09, 14:51    [7791532]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
Dag
Member

Откуда:
Сообщений: 842
XAndy

--------------------Configuration: newproba - Win32 Release--------------------
Compiling...
newproba.cpp
C:\CPP\newproba\newproba.cpp(21) : error C2065: 'p0' : undeclared identifier
C:\CPP\newproba\newproba.cpp(21) : error C2228: left of '.ev_handle' must have class/struct/union type
C:\CPP\newproba\newproba.cpp(22) : error C2228: left of '.ev_length' must have class/struct/union type
C:\CPP\newproba\newproba.cpp(23) : error C2228: left of '.ev_handle' must have class/struct/union type
C:\CPP\newproba\newproba.cpp(35) : error C2228: left of '.ev_length' must have class/struct/union type
C:\CPP\newproba\newproba.cpp(36) : error C2228: left of '.ev_handle' must have class/struct/union type
C:\CPP\newproba\newproba.cpp(36) : error C2065: 'OutMemory' : undeclared identifier
C:\CPP\newproba\newproba.cpp(37) : error C2228: left of '.ev_length' must have class/struct/union type
C:\CPP\newproba\newproba.cpp(40) : error C2228: left of '.ev_handle' must have class/struct/union type
Error executing cl.exe.

newproba.fll - 9 error(s), 0 warning(s)

А кто такой p0 ?
15 окт 09, 19:46    [7793646]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
Dag,
сорри, я просто выдрал кусок кода :)
#define  p0                 (parm->p[0].val)
#define  OutMemory     182
16 окт 09, 10:50    [7795235]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Можно так пробелы убирать:
lcText = '1 2  3   4    5     6      7      8'
? chrtran(strtran(strtran(lcText, '  ', ' ' + chr(0)), chr(0) + ' ', ''), chr(0), '')
16 окт 09, 12:38    [7796134]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
q1w1e1
Member

Откуда: Кы-рск
Сообщений: 1034
Dima T,

спасибо, как раз можно использовать в Selecte этот набор из стандартных функций :-)
21 окт 09, 11:24    [7816198]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
Guest12345
Guest
q1w1e1,

такая тема была ранее
https://www.sql.ru/forum/actualthread.aspx?bid=37&tid=508208&hl=reduce

хотя я не понимаю, почему нельзя было использовать

aa= 'ddd 35 65 86 56'
? chrtran(aa,' ','')
6 дек 09, 05:02    [8024959]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
Guest12345
Guest
не заметил, что уже было выше

do while " "$cStr
cStr = strtran(cStr," "," ")
enddo

aa= 'ddd 35 65 86 56'
? chrtran(aa,' ',' ')
6 дек 09, 05:06    [8024963]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
Crispy
Member

Откуда:
Сообщений: 523
a='fsfsf'+space(5)+'hkkejej'+space(10)+'sfs gfhdjhd fhrhr '
?a

SET LIBRARY TO SYS(2004)+"foxtools.fll"
? reduce(a,' ')
10 дек 09, 09:33    [8044423]     Ответить | Цитировать Сообщить модератору
 Re: Убрать лишние пробелы между словами  [new]
Crispy
Member

Откуда:
Сообщений: 523
Короче велосипед. :D
10 дек 09, 09:37    [8044445]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить