Сокращение текста в текстовом поле - PullRequest
0 голосов
/ 04 марта 2011

Я работаю над представлением, которое выбирает большое текстовое поле из другой таблицы. (Нет, не снимки.) Эта таблица содержит журнал ошибок из веб-приложения, предоставляющего доступ к нему. Однако этот журнал ошибок содержит несколько очень длинных текстов, которые делают столбец очень широким.
Поэтому я хочу выделить текстовое поле, но любое слово длиной более 20 символов должно быть заменено на первые три, эллипс (...) и последние три буквы. Пример:

 - System.Web.HttpException: The client
   disconnected. --->
   System.Web.UI.ViewStateException:
   Invalid viewstate. Client IP:
   xxx.xxx.xxx.xxx Port: xxxx
   User-Agent: Mozilla/4.0 (compatible;
   MSIE 7.0; Windows NT 6.1; WOW64;
   Trident/4.0; SLCC2; .NET CLR
   2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C;
   .NET4.0E) ViewState:
   T89RiGYTOALETOKughad85KzoDRo/ut3Vlnd1qECsYf1t9GGNilDrvbRn8l45SVX8AsZrs6zyEngk8MKdpoRecI4j0X5IsmI0Deldf4nLKNlLoE4xaOoMUlj7hTFRXAvqyOFSvzsvyhwpWCLuG26RJT4YbGr1IJYgqWX9KVplIdasDUR0aNNMvD9FVa8Fi33Ny7fuIjxPKMpqKByKYJtAgZU4PIji88MMQWQDMNZmBxM965+bN+RsvTSxrGWzLLhzFCrK0LeCCrZeRQyncmMhUPGM9YB1+UapRfeca3R4vCacN6vv/UnZekBXP5rzAvDgJB9RGgXKhhdBVeCCD3h2N6X5RxKKLdy76h3AVZ8H8DfJpdjvre8ExNdkHeCOZWz0EjyX9hNMe2KZ2+gmEQaFi/mNJ5nZzCjOCfYsdbwAorpEGBZNqX9gBjDs32e8Admgdk+zvxl3Mt4pF3e6zTh45N1cCjBNCLya6Rd9d9mfiPM6DFbXUBiXw8dbZmT/6veCw0YPfRCjKCod3D7+Kva44RuiIkKIIqr0vPLLlja/ggH/4iHq9SqgOpwGJuoHGfy++5G14bIv3Zyzm8Vj+re3iMfbwZCUI4sCeFy7L7I6NrL27pd+6Qz60WAMv6lPl3Y88J5CUIVAIZqINsOt5htisTf00+d0pFptx5wwlmprzm1dVfXcL/0x3BPvlNDof5aW+PJxAP19SHR+PUuAEm9YO0ZmhGg+L5+DN2kuHSpQFpwC6FxCzVdicxlR8+x4jUy2+Fxeblabla

Это должно стать:

 - System.Web.HttpException: The client
   disconnected. --->
   System.Web.UI.ViewStateException:
   Invalid viewstate. Client IP:
   xxx.xxx.xxx.xxx Port: xxxx
   User-Agent: Mozilla/4.0 (compatible;
   MSIE 7.0; Windows NT 6.1; WOW64;
   Trident/4.0; SLCC2; .NET CLR
   2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C;
   .NET4.0E) ViewState: T89...bla

И да, этот первый текст чрезвычайно широк ... Даже ТАК трудно показать его правильно. :-)
Поэтому мне, вероятно, нужно что-то делать с регулярными выражениями или чем-то еще. Таким образом: SELECT REGEX (что-то, что-то, что-то) из MyTable; или еще что.
Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

Может быть, это поможет

CREATE FUNCTION dbo.EllipseTextWords(@Text VARCHAR(MAX), @EllipsedSize INT, @Separator AS VARCHAR(1), @EllipsisLength INT = 3)
RETURNS VARCHAR(MAX)
AS
BEGIN

    DECLARE @Tokens TABLE
    (
        Token VARCHAR(MAX)
    )

    WHILE (CHARINDEX(@Separator, @Text) > 0)
    BEGIN
        INSERT INTO @Tokens
        SELECT LTRIM(RTRIM(SUBSTRING(@Text, 1, CHARINDEX(@Separator, @Text) - 1)))

        SET @Text = SUBSTRING(@Text, CHARINDEX(@Separator, @Text) + 1, LEN(@Text))
    END

    INSERT INTO @Tokens
    SELECT LTRIM(RTRIM(@Text))

    UPDATE @Tokens SET Token = LEFT(Token, @EllipsisLength) + '...' + RIGHT(Token, @EllipsisLength) WHERE Token <> '' AND LEN(Token) > LEN(LEFT(Token, @EllipsedSize))

    DECLARE @Ellipsed VARCHAR(MAX)
    SELECT @Ellipsed = COALESCE(@Ellipsed + @Separator, '') + Token FROM @Tokens 

    RETURN @Ellipsed

END

тогда вы можете вызвать созданную функцию

SELECT dbo.EllipseTextWords(Details, 20, ' ', DEFAULT) FROM ErrorLog

но мне интересно, почему вы не делаете это на уровне представления.

1 голос
/ 05 марта 2011

Как насчет следующего решения. Предполагая, что ваша таблица, содержащая журнал ошибок, называется ErrorLog и имеет столбец Details, в котором содержится большой текст, на который вы ссылаетесь.

  1. Создайте специальную функцию, которая разбивала бы текстовое содержимое на слова (взято из здесь , но по существу любая подобная функция будет работать):

    CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))     
    returns @temptable TABLE (items varchar(8000))     
    as     
    begin
        declare @idx int     
        declare @slice varchar(8000)
    
        select @idx = 1     
        if len(@String) < 1 or @String is null  return     
    
        while @idx != 0    
        begin     
           set @idx = charindex(@Delimiter, @String)     
           if @idx != 0     
             set @slice = left(@String, @idx - 1)     
           else     
             set @slice = @String     
    
           if(len(@slice) > 0)
             insert into @temptable(Items) values(@slice)     
    
           set @String = right(@String, len(@String) - @idx)     
           if len(@String) = 0 break     
         end 
         return     
    end
    
  2. Затем извлеките текстовое поле из таблицы ErrorLog, используя следующий запрос (в основном, он перебирает все слова, проверяет длину каждого элемента и затем объединяет их в новую строку):

    SELECT 
    (
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
            (SELECT (CASE WHEN LEN(items) > 50 
                     THEN LEFT(items, 3) + '...'  + RIGHT(items, 3) 
                     ELSE items
                     END) + ' '
             FROM dbo.Split(ErrorLog.Details, ' ') FOR XML PATH (''))
        ,'&amp;','&')
        ,'&lt;','<')
        ,'&gt;','>')
        ,'&#x0A;',char(10))
        ,'&#x0D;',char(13))
        ,'&#x09',char(9))
     )
    AS Details 
    FROM ErrorLog
    

Обратите внимание, что я использую 50 в качестве порогового значения, поскольку в противном случае оно также будет обрезать такие элементы, как 'System.Web.HttpException', длина которых> 20.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...