Страницы: 1
RSS
Разбить текст на строки указанной длины без разрыва слов
 
Прошу помощи в написании формулы. Не смог полностью решить задачу. Направьте меня если же есть решение. Найти на форуме не смог.

Задача: есть произвольный текст в ячейке А1. Например: "В лингвистике термин «текст» используется в широком значении, включая и образцы устной речи. Восприятие текста изучается в рамках лингвистики текста и психолингвистики. Так, например, И. Р. Гальперин определяет текст следующим образом: «это письменное сообщение, объективированное в виде письменного документа, состоящее из ряда высказываний, объединённых разными типами лексической, грамматической и логической связи, имеющее определённый моральный характер, прагматическую установку и соответственно литературно обработанное"

Необходимо разбить текст на строки, не более 69 символов в 1 строке, не разделяя слова (без переноса).

Первую строку можно извлечь по формуле:
Код
=ЛЕВСИМВ(A1;НАЙТИ("/";ПОДСТАВИТЬ(ПСТР(A1;1;69);" ";"/";69-ДЛСТР(ПОДСТАВИТЬ(ПСТР(A1;1;69);" ";"")))))

Получается 1-я строка:
В лингвистике   термин «текст» используется в широком значении,
Вторую строку пытаюсь составить с командой ПСТР:
Код
=ПСТР(A1;НАЙТИ("/";ПОДСТАВИТЬ(ПСТР(A1;1;69);" ";"/";69-ДЛСТР(ПОДСТАВИТЬ(ПСТР(A1;1;69);" ";""))))+1;69)

Получается 2-я строка:
включая и образцы   устной речи. Восприятие текста изучается в рамках л
Не пойму, что писать вместо "69" (в конце формулы).

Третью и последующую строку аналогично выделить надо.
Изменено: qwerty66 - 17.03.2019 12:00:40
 
Форум, похоже, не такой уж живой. Печалька.
 
Цитата
qwerty66 написал:
не такой уж живой. Печалька.
Печалька в том, что вы ограничили способ решения одной единственной формулой. Макросы и Power Query для вас по боку. А формулистам вполне возможно и не интересно. Для остальных участников он более чем живой - не стоит всё своим аршином мерять.
 
в А5 массивную
Код
=ЕСЛИОШИБКА(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;НАЙТИ("/";ПОДСТАВИТЬ(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;69);" ";"/";69-ДЛСТР(ПОДСТАВИТЬ(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;69);" ";"")))));ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;69))
 
Цитата
qwerty66 написал:
Форум, похоже, не такой уж живой
На основании чего Вы сделали такой вывод? Не отвечают именно в Вашей теме?
 
=IF(MID(TRIM(MID($A$1;SUM(LEN(C$3:C3)+1);LEN($A$1)))&REPT(" ";70);70;1)=" ";LEFT(TRIM(MID($A$1;SUM(LEN(C$3:C3)+1);LEN($A$1)));69);LEFT(TRIM(MID($A$1;SUM(LEN(C$3:C3)+1);LEN($A$1)));68-LEN(TRIM(RIGHT(SUBSTITUTE(LEFT(TRIM(MID($A$1;SUM(LEN(C$3:C3)+1);LEN($A$1)));69);" ";REPT(" ";99));99)))))
По вопросам из тем форума, личку не читаю.
 
UDF
Код
Function SplitByLen$(s$, n%, i%)
    With CreateObject("vbscript.regexp")
        .Pattern = "(?:\s*|^)(.{0," & n & "})(?=\s|$)"
        .Global = True
        If .test(s) Then
            SplitByLen = .Execute(s)(i - 1).submatches(0)
        End If
    End With
End Function

формула
Код
=SplitByLen(A$1;B$1;СТРОКА(A1))
Изменено: Андрей Лящук - 18.03.2019 23:59:28
 
С дополнительным столбцом В. В столбце С проверка длины полученных строк.
Формула протягиваемая.
Алексей М.
 
Код
=ПСТР($A$1;СУММПРОИЗВ(ДЛСТР($A$6:A6))+1;ПРОСМОТР(999;ПОИСК(" ";ПСТР($A$1;СУММПРОИЗВ(ДЛСТР($A$6:A6))+1;69);СТРОКА($1:$999)))-1)

не до конца работает, в последней косяк. :(
Изменено: V - 19.03.2019 08:20:40
 
Цитата
qwerty66 написал:
Форум, похоже, не такой уж живой. Печалька.
Беру свои слова обратно. Никого не хотел обидеть. Спасибо за отклики.
Цитата
Андрей VG написал:
Макросы и Power Query для вас по боку.
Макросами и Power Query не владею, к сожалению. Не хотел нагло просить решить таким образом проблему. Поэтому просил направить меня по формулам.
Цитата
Юрий М написал:
На основании чего Вы сделали такой вывод? Не отвечают именно в Вашей теме?
Нет. Если отвечают только в определённых темах, то можно так подумать. Я своё мнение поменял.

Теперь буду разбираться в ответах с помощью от форумчан.
Всем спасибо.
 
Цитата
БМВ написал:
=ЕСЛИОШИБКА(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;НАЙТИ("/";ПОДСТАВИТЬ(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;69);" ";"/";69-ДЛСТР(ПОДСТАВИТЬ(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;69);" ";"")))));ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;69))
Данный способ работает на 146%, мои формулы можно выкидывать. Спасибо. Проблема решена.
Изменено: qwerty66 - 19.03.2019 08:38:34
 
qwerty66, у АlехМ, правильный результат. ваша формула в первой строке не дает верный результат
еще одна фм
Код
=ЕСЛИОШИБКА(ПСТР(ПСТР($A$1;СУММ(ДЛСТР($A$3:A3))+1;НАЙТИ("/";ПОДСТАВИТЬ(ПСТР($A$1;СУММ(ДЛСТР($A$3:A3))+1;69+1);" ";"/";69+1-ДЛСТР(ПОДСТАВИТЬ(ПСТР($A$1;СУММ(ДЛСТР($A$3:A3))+1;69+1);" ";"")))));1;69);ПСТР($A$1;СУММ(ДЛСТР($A$3:A3))+1;69))
Изменено: artyrH - 19.03.2019 08:46:32
 
Цитата
Андрей Лящук написал:
формула Код ? 1=SplitByLen(A$1;B$1;СТРОКА(A1))
Тоже работает как надо. Спасибо.
Цитата
artyrH написал:
в А5 массивнуюКод ? 1=ЕСЛИОШИБКА(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;НАЙТИ("/";ПОДСТАВИТЬ(ПСТР($A$1;СУММ(ДЛСТР($A$4:A4))+1;69);" "
У меня получилось только для второй строки, третью и следующие строки не смог. Спасибо.
Изменено: qwerty66 - 19.03.2019 08:55:03
 
Цитата
АlехМ написал:
С дополнительным столбцом В. В столбце С проверка длины полученных строк.Формула протягиваемая.
Спасибо за дополнительный рабочий вариант.
 
подправил
Код
=СЖПРОБЕЛЫ(ПСТР($A$1;СУММПРОИЗВ(ДЛСТР($A$6:A6))+СТРОКА(A1);ЕСЛИ(ДЛСТР($A$1)-СУММПРОИЗВ(ДЛСТР($A$6:A6))-СТРОКА(A1)<=69;69;ПРОСМОТР(999;ПОИСК(" ";ПСТР($A$1;СУММПРОИЗВ(ДЛСТР($A$6:A6))+СТРОКА(A1);70);СТРОКА($1:$999))))))
 
Цитата
V написал:
не до конца работает, в последней косяк.
Всё равно спасибо.
 
Цитата
qwerty66 написал:
не смог
.
 
Цитата
artyrH написал:
qwerty66 , у  АlехМ , правильный результат. ваша формула в первой строке не дает верный результатеще одна фм
И Вам спасибо за вариант.

Тему можно закрывать. Проблема решена, хоть я и не понял до конца как. Всем удачи.
Изменено: qwerty66 - 19.03.2019 09:08:37
 
также как и предыдущая массивная и одна для всех строк
=TRIM(MID(TRIM($A$1)&" ";SUM(LEN(K$3:K3)+1);MAX(ROW(INDEX($A:$A;SUM(LEN(K$3:K3)+1)):INDEX($A:$A;SUM(LEN($K$3:K3)+1)+69))*(MID(TRIM($A$1)&" ";ROW(INDEX($A:$A;SUM(LEN($K$3:K3)+1)):INDEX($A:$A;SUM(LEN($K$3:K3)+1)+69));1)=" "))-SUM(LEN(K$3:K3)+1)))
Изменено: БМВ - 19.03.2019 09:03:53
По вопросам из тем форума, личку не читаю.
 
Вариант функции на PQ. Была такая в моем конвертере таблиц в автокадовские спецификации по ГОСТ (кто знает тот поймет какой это трэш).

Алгоритм тупой так как надо разбивать не по числу символов, а по суммарным их весам (ввиду того что не для моноширинных шрифтов разные символы имеют разный размер). В связи с тем что уже давно не работаю с ACad, новая версия генератора спецификаций по ГОСТ осталась недопиленной.

Код
   Text.CrLfSymbols = {" ",",",":",";","-","/","*","\","!","?","[","]","{","}","~","'","|"},

   Text.SplitSmart = 
    (
     InputText as nullable text,    // Входной текст
     SegmentMin as number,          // Минимальное число символов, функция не разбивает строку до этого числа символов
     SegmentMax as number           // Максимальное число символов. Если функция не найдет символа для переноса от SegmentMin до SegMentMax, перенос будет произведен по SegmentMax.
    ) as list =>            
       let
        Len = if InputText = null then 0 else Text.Length(InputText),
        Out = if Len > SegmentMax then
         let
          Pos_A = Text.PositionOfAny(Text.Range(InputText, SegmentMin, SegmentMax - SegmentMin), Text.CrLfSymbols, Occurrence.Last),
          Pos_B = if Pos_A < 0 then SegmentMax else SegmentMin + Pos_A + 1,
          Txt_A = Text.Start(InputText, Pos_B),
          Txt_B = Text.End(InputText, Len - Pos_B)
         in List.Combine({{Txt_A}, @Text.SplitSmart(Txt_B, SegmentMin, SegmentMax)}) 
        else
         {InputText}
       in Out,
Изменено: Alexey_Spb - 19.03.2019 09:20:12
 
Без дополнительного столбца. Формула протягиваемая
Код
=ЛЕВБ(ЗАМЕНИТЬ(A$1;1;СУММПРОИЗВ(ДЛСТР(A$3:A3))+СЧЁТЗ(A$3:A3););ПРОСМОТР(69;ПОИСК("? ";ЗАМЕНИТЬ(A$1;1;СУММПРОИЗВ(ДЛСТР(A$3:A3))+СЧЁТЗ(A$3:A3);)&" ";СТРОКА($1:$69))))
Алексей М.
 
Спасибо.



Горшочек, не вари.
 
Цитата
qwerty66 написал:
Горшочек, не вари.
Сами виноваты
Цитата
qwerty66 написал:
Форум, похоже, не такой уж живой. Печалька.
По вопросам из тем форума, личку не читаю.
 
:D  В точку.
 
И Еще вариант
=MID(" "&TRIM($A$1);SUM(LEN($S$3:S3)+1)+1;LOOKUP(69;SMALL(IF(MID(" " & TRIM($A$1)&" ";ROW(INDEX(A:A;SUM(LEN($S$3:S3)+1)+1):$A$999);1)=" ";ROW(INDEX(A:A;SUM(LEN($S$3:S3)+1)+1):$A$999)-(SUM(LEN($S$3:S3)+1)));TRANSPOSE(ROW($A$1:$A$999)))-1))
Изменено: БМВ - 19.03.2019 20:00:59
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх