2014-09-28 4 views
3

Мне нужно обрезать пробелы (включая табуляции, символы перевода строк и т. Д.) Из строки без, затрагивающих внутренние пробелы. Например:Обрезание пробелов без влияния на внутренние пробелы



foo 
bar 
    baz 
    

стал бы

foo 
bar 
    baz

Конечно LTRIM/RTRIM не будет достаточно, потому что они только удалить пробелы. Здесь есть несколько сообщений, которые показывают, используя метод REPLACE для обработки других символов (например, this one), но, конечно, это также приведет к удалению внутренних символов. Я не смог найти здесь пример, чтобы показать, как удалить только строки и символы пробелов в строке.

ответ

0

Вот мое текущее решение, но я бы приветствовал другие предложения. Для VARCHAR значений:

DECLARE @str varchar(8000) , 
     @pat varchar(100) = '%[^ ' + CHAR(9) + '-' + CHAR(13) + ']%'; 

SET @str = /* load value */ 

SET @str = SUBSTRING(@str , PATINDEX(@pat , @str) , 
     DATALENGTH(@str) - 
     PATINDEX(@pat , @str) - 
     PATINDEX(@pat , REVERSE(@str)) + 2); 

Но поскольку NVARCHAR символы занимают 2 байта, вы должны будете разделить DATALENGTH на 2 в этом случае:

DECLARE @str nvarchar(4000) , 
     @pat varchar(100) = '%[^ ' + CHAR(9) + '-' + CHAR(13) + ']%'; 

SET @str = /* load value */ 

SET @str = SUBSTRING(@str , PATINDEX(@pat , @str) , 
     DATALENGTH(@str)/2 - 
     PATINDEX(@pat , @str) - 
     PATINDEX(@pat , REVERSE(@str)) + 2); 

Обратите внимание, что модель используется здесь (@pat) только охватывает символы ASCII. Этого было достаточно для моих требований, но если необходима полная поддержка Unicode, вы можете расширить шаблон. Для получения полного списка см. Wikipedia: Whitespace character.

И, конечно, было бы легко преобразовать это в UDF для удобства повторного использования.

0

Вы должны попробовать это:

DECLARE @testString varchar(255) 
set @testString = 'MY STRING  ' 

/*I always use this like a final solution*/ 
SET @testString = REPLACE(REPLACE(REPLACE(@testString, CHAR(9), ''), CHAR(10), ''), CHAR(13), '') 
SELECT @testString 

/* 
CHAR(9)  - Tab 
CHAR(10) - New Line 
CHAR(13) - Carriage Return 
*/ 
+0

Это не будет работать. Как я упоминал в вопросе, мне нужно сохранить внутренние пробелы, но «REPLACE» удалит указанные символы в любом месте строки. –

+0

Чувак мы заменяем только CHAR (9) CHAR (10) и CHAR (13) с пробелом. – Navneet

+0

Я понимаю это, но проблема в том, что он должен удалять только те символы, когда они появляются в начале или в конце строки. Мне нужно держать их, когда они появляются в середине строки. См. Пример выше, если это не ясно. –

1

Эта функциональность легко обрабатывается SQLCLR. Вы можете написать свою собственную функцию, которая делает простой String.Trim(), или вы можете загрузить уже написанную функцию, такую ​​как функция String_Trim() из библиотеки SQL#. Я являюсь автором SQL #, но функция String_Trim (и многие другие, включая регулярные выражения и т. Д.) Доступны в бесплатной версии.

String_Trim() удаляет пробелы (вкладки, символы новой строки, возврат каретки и пробелы) с обоих концов строки, не касаясь пробелов между символами без пробелов. Если вы скопируете и вставьте код примера ниже, вы увидите, что до и после символов без пробелов, а также между ними, это сочетание каждого типа символа пробела (ну, табы преобразуются в пробелы здесь, поэтому я для ввода вкладок явно).

Это так просто, как:

PRINT N'~~' + SQL#.String_Trim(N' ' + NCHAR(9) + N' 
    ' + NCHAR(9) + N' gfgj  
lf  ' + NCHAR(9) + N'  

g 

' + NCHAR(9) + N'  g   
    ' + NCHAR(9) + N' ') + N'~~'; 

Выход:

~~gfgj 
lf    

g 

    g~~ 
+1

Сценарий, над которым я работал, был частью процесса обслуживания. Мне нужно было что-то полностью самодостаточное и не полагалось бы на какие-либо другие ранее существовавшие объекты. Тем не менее, я вижу, что библиотека может пригодиться. Я могу в конечном итоге отказаться от моего скрипта, чтобы воспользоваться некоторыми другими его функциями. +1 Потому что это, вероятно, полезно будущим читателям. –

0

Использование ниже запроса это работает:

DECLARE @trimchars VARCHAR(10),@str varchar(max) 
SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32) 
set @str='test string   it is' 
IF @str LIKE '[' + @trimchars + ']%' SET @str = SUBSTRING(@str, PATINDEX('%[^' + @trimchars + ']%', @str), 8000) 
IF @str LIKE '%[' + @trimchars + ']' SET @str = SUBSTRING(reverse(@str), PATINDEX('%[^' + @trimchars + ']%', reverse(@str)), 8000) 
select @str 
0

Я нашел этот here, и изменил его немного. Это будет работать в вашем случае. Любые предложения или отзывы будут высоко оценены.

Go 

CREATE FUNCTION dbo.LeftTrim(@str VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @trimchars VARCHAR(10) 

    SET @trimchars = CHAR(9) + CHAR(10) + CHAR(13) + CHAR(32) 

    IF @str LIKE '[' + @trimchars + ']%' 
     SET @str = STUFF(@str, 1, PATINDEX('%[^' + @trimchars + ']%', @str) - 1, '') 

    RETURN @str 
END 
GO 


CREATE FUNCTION dbo.RightTrim(@str VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @trimchars VARCHAR(10) 

    SET @trimchars = CHAR(9) + CHAR(10) + CHAR(13) + CHAR(32) 

    IF @str LIKE '%[' + @trimchars + ']' 
     SET @str = REVERSE(dbo.LeftTrim(REVERSE(@str))) 

    RETURN @str 
END 
GO 

CREATE FUNCTION dbo.SuperTrim(@str VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    RETURN dbo.LeftTrim(dbo.RightTrim(@str)) 
END 
GO 

- Иллюстрация

DECLARE @testStr AS VARCHAR(MAX)='' 
SELECT @testStr='my first line ' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + 'second line ' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 

SELECT dbo.SuperTrim(@testStr) + '--end of line' 
Смежные вопросы