AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.07.2004, 13:14   #1  
NJD is offline
NJD
Участник
 
210 / 26 (1) +++
Регистрация: 21.05.2003
Адрес: Moscow
Функция, которая убирает перевод каретки в строке.
У меня формируется строка.
out = "

qudhqweud
wedfwed

";
Есть функция, которая отрубит пустые строки справа и слева? Спасибо.
Старый 26.07.2004, 13:21   #2  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
strRem(out, '\n');
__________________
Андрей.
Старый 26.07.2004, 13:22   #3  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
попробуй strrtrim( strltrim( ... ) )
Старый 26.07.2004, 13:28   #4  
simply is offline
simply
Участник
 
84 / 10 (1) +
Регистрация: 24.05.2004
Адрес: москва
ведущие пробелы уберет str StrLTrim (str text)

ведомые пробелы уберет str StrRTrim (str text)

последний символ \n убирается при присвоении ... а символы ACII(10) перевод каретки что у тебя в середине строки... я убирал перебром символов строки... функции замены я не нашел... может плохо искал...
Старый 26.07.2004, 13:32   #5  
simply is offline
simply
Участник
 
84 / 10 (1) +
Регистрация: 24.05.2004
Адрес: москва
Цитата:
Изначально опубликовано Dron AKA andy
strRem(out, '\n');
тогда получится строка типа out = "qudhqweudwedfwed";

потому что убив перевод строки ты ни чего не подставляешь... пользователи не оставляют пробелов преждне чем клацнуть на ентер...
Старый 26.07.2004, 13:46   #6  
simply is offline
simply
Участник
 
84 / 10 (1) +
Регистрация: 24.05.2004
Адрес: москва
Если не найдешь ни чего более красивого... попробуй вот так:

str RemEx (str strStringIn)
{
str strStringOut='';
int iLoopString;

;

for(iLoopString = 1;iLoopString <= StrLen(strStringIn);iLoopString++)
{

if ( Char2Num (strStringIn,iLoopString) == 10 ) strStringOut += '';
else strStringOut += substr( strStringIn,iLoopString,1);
}
return strStringOut;
}
Старый 26.07.2004, 13:53   #7  
NJD is offline
NJD
Участник
 
210 / 26 (1) +++
Регистрация: 21.05.2003
Адрес: Moscow
StrLTrim и StrRTrim - они пробелы откидывают.
Старый 26.07.2004, 16:33   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
PHP код:
    while(i<100)
    {
        if(
strLine(outi) != '')
            
+ ('\n' '') + strLine(outi);
        
i++;
    }
    
info(s); 
Порубает все пустые строки, если всего строк < 100
Старый 26.07.2004, 19:32   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вот, сваял за 10 минут

PHP код:
    str DelLR(str s)
{
    
int k;
    
// Ведущие переводы строки
    
strLTrim(s);
    
strScan(s,'\n',1,strLen(s));
    while (
== 1)
    {
        
strDel(s,k,1);
        
strLTrim(s);
        
strScan(s,'\n',1,strLen(s));
    }
    
// Концевые переводы строки
    
strRTrim(s);
    
strScan(s,'\n',strLen(s),-strLen(s));
    while (
== strLen(s))
    {
        
strDel(s,k,1);
        
strRTrim(s);
        
strScan(s,'\n',strLen(s),-strLen(s));
    }
    return 
s;

Или так, через перебор строк. Правда, в этом случае удаляются вообще все пустые строки. Не только ведущие и концевые

PHP код:
    str DelLR2(str s)
{
    
int k,z;
    
str s1,s2;

    
// Количество строк
    
strScan(s,'\n',1,strLen(s));
    while (
k)
    {
        
z++;
        
strScan(s,'\n',k+1,strLen(s));
    }
    
    
// Удаление пустых строк
    
for(k=1;k<=z;k++)
    {
        
s1 strLTrim(strRTrim(strLine(s,k)));
        if (
s1 != '')
        {
            
s2 += '\n'+s1;
        }
    }

    
// Проверка на отсутсвие перевода строк
    
if (z)
    {
        
s2 subStr(s2,2,strLen(s2)-1);
    }
    else
    {
        
s2 strLTrim(strRTrim(s));
    }

    return 
s2;

Старый 27.07.2004, 08:39   #10  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Зачем же так сложно-то?
Было, делал нечто похожее.
Вот еще один вариант:
PHP код:
    static void emptyLinesTrim(Args _args)
    {
        
str tst "\n\nстрока с пробелом\nвторая строка\n\nчетвертая строка\n\n\n";
        ;
        
BOX::info('<' tst '>');
    
        
tst strReplace(tst"\n""  "); // два пробела (или больше)
        
tst strLRTrim(tst);
        
tst strReplace(tst"  ""\n"); // восстановим неконцевые переводы строк
    
        
BOX::info('<' tst '>');
    } 
__________________
Старый 27.07.2004, 09:18   #11  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Ruff, у меня была такая же идея, но потом я заметил, что strReplace - X++ функция в Global. В результате вариант показался не "простым"
Старый 27.07.2004, 10:07   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ruff
У этого способа тот недостаток, что в тексте символьной строки вполне может оказаться то количество пробелов на которое происходит замена символа перевода строки.

Например, вставили меджу текстовыми строками пустую строку из 20 символов. И что получится после Вашего кода?

Кроме того, сам код функции strReplace относительно сложен. Так что вопрос "зачем так сложно" автоматически переадресуется к коду strReplace. Ну, разве что, он уже написан.
Старый 27.07.2004, 10:14   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
посмотрите хелп разработчика по функции match
попробуйте использовать эту функцию

Character Description
\
A backslash causes a specific character to be matched. For example, "\$" matches a dollar sign.
< or ^
A 'less than' (<) sign or a circumflex (^) at the start of an expression is used to match the start of a line.
> or & A 'greater than' (>) sign or an ampersand (&) at the end of the expression is used to match the end of a line.

? or . A question mark (?) or a full stop (.) will match any character (except Enter, new line).
:x A colon specifies a group of characters to be matched, indicated by the character which follows immediately after.
:a sets the match to letters
:d sets the match to numeric characters
:n sets the match to alphanumeric characters
:SPACE sets the match to blanks, tabulations, and control characters such as Enter (new line).
* An expression followed by an asterisk requires a match for none or several occurrences of the expression.
For example, "fo*" will locate "f", "fo", "foo" etc.
+
An expression followed by a plus (+) sign requires a match for one or several occurrences of the expression.
For example, "fo+" matches "fo" etc.
-
An expression followed by a minus (-) sign requires a match for no or one occurrence of the expression.
For example, "fo-" matches "f" and "fo".
[]
A string of characters enclosed within square brackets specifies that a match is required for every character in this text, and only for these characters.
For example, "[xyz]" matches "xx" and "zyx" etc.
A string of characters can be specified by two characters separated by '-' (minus).
For example, "[a-z]" matches all letters, whereas "[z-a]" never matches.
[^]
If the first character in a text within square brackets is a circumflex (^) then the expression matches all characters except Enter (new line) and the characters in the string.
For example, "[^xyz]" matches "abc" but not "axb".
Старый 27.07.2004, 12:48   #14  
NJD is offline
NJD
Участник
 
210 / 26 (1) +++
Регистрация: 21.05.2003
Адрес: Moscow
Тут я почитал всё это...
Вспомнилось СокрЛП("стр");
Кто знает - тот поймет
Старый 27.07.2004, 13:14   #15  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Изначально опубликовано Владимир Максимов
Ruff
У этого способа тот недостаток, что в тексте символьной строки вполне может оказаться то количество пробелов на которое происходит замена символа перевода строки.
Например, вставили меджу текстовыми строками пустую строку из 20 символов.
Согласен. Но я лишь предложил конкретное решение для конкретной задачи. Более того, где в реальной жизни может встретиться текст с большим кол-вом идущих подряд пробелов? Разве что в старых ДОС-овских программах (хотя, если не ошибаюсь, даже старый добрый Лексикон умел схлопывать лишние пробелы, заменяя их табуляцией и переводом каретки).

Давайте зададим 100, 200 пробелов для пущей надежности . Все зависит от критичности данной функции с т.з. быстродействия. Может она будет вызываться раз в день, так что в этом плохого?
Цитата:
Изначально опубликовано Wamr
...но потом я заметил, что strReplace - X++ функция в Global. В результате вариант показался не "простым"
Цитата:
Изначально опубликовано Владимир Максимов
Кроме того, сам код функции strReplace относительно сложен. Так что вопрос "зачем так сложно" автоматически переадресуется к коду strReplace. Ну, разве что, он уже написан.
Вот в том-то и дело, что уже написан. Под словом "сложно" я не имел ввиду скорость обработки, скорее речь шла о "читабельности" кода. Абсолютно согласен, что в большинстве случаев код, написанный "с нуля" будет наиболее оптимальным. Но это не должно заставять отказываться от использования готовых наработок.

Mazzy,
функция match, конечно привлекательна. Но, к сожалению, только для поиска. Чтобы сделать в тексте "умную" замену, все-равно приходится в той или иной мере прибегать к обсуждавшимся здесь "выкрутасам" .
Может, я недостаточно с этим разобрался...
__________________
Старый 27.07.2004, 14:02   #16  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано Ruff
функция match, конечно привлекательна. Но, к сожалению, только для поиска.
А для замены есть TextBuffer.
PHP код:
TextBuffer textBuffer = new TextBuffer();
;
textBuffer.setText("\n\nText line 1\n\nTextLine3\n\n\n");
textBuffer.regularExpressions(true);
textBuffer.replace("<: +""");
textBuffer.replace(": +>""");
info(textBuffer.getText()); 
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 27.07.2004, 14:13   #17  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Красиво! Спасибо!

Век живи - век учись...
__________________
Старый 27.07.2004, 14:27   #18  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
NJD Тут я почитал всё это...
Вспомнилось СокрЛП("стр");
Кто знает - тот поймет
Понимаю. Вот что тебе нужно (работает именно как СокрЛП())

PHP код:
public static str removeLRSpacesstr s )
{
    
str c;
    
int l 0strlen) + 1;
    do {
        
l++;
        
substrsl);
    } while ( 
!= "" && (== " " || == "\n" || == "\r" || == "\t") );
    do {
        
r--;
        
substrsr);
    } while ( 
&& (== " " || == "\n" || == "\r" || == "\t") );
    return 
<= substrsl) : "";

В отличие от axapta-вских strr/ltrim оно понимает под пробельными символами как пробелы, так и переводы строк с возвратами каретки и табуляцией иже с ними. И работает именно так как тебе надо без побочных эффектов, коими обладает половина здесь приведенных решений.
Старый 27.07.2004, 14:33   #19  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Да, действительно решение с TextBuffer в пять строк решает проблему, хотя и использует объект для своей реализации.
Кстати - а в стандартных доках есть помощь по регулярным выражениям в TextBuffer???
Старый 27.07.2004, 15:28   #20  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Они совпадают с регулярными выражениями в функции match. См. справку по этой функции.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Банковский перевод. Простой вопрос LEM DAX: Функционал 0 27.03.2008 14:41
сумма по строке закупки Nikolaich DAX: Программирование 2 03.04.2007 13:37
Скидка по строке и многострочная скидка efim DAX: Функционал 0 18.06.2003 16:32
Функция "Удалить строки" Oks DAX: Функционал 1 03.07.2002 18:09
Функция RunBuf Maxim Gorbunov DAX: База знаний и проекты 0 27.11.2001 17:15

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:41.