18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
1

Ограничить длину строк в тексте

26.12.2020, 16:29. Показов 4551. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется некий текст в которм строки совершенно разной длины (есть и пустые строки то есть просто перенос на новую строку vbCrLf ). Нужно чтобы ни одна строка в тексте не превышала заданную длину maxlen, но так, чтобы слова не разделялись, то есть если разделение символом vbCrLf придётся посреди слова, например "совершенно раз/ной длины", то строка должна разделиться по пробелу перед словом на которое пришлось разделение:"совершенно /разной длины" то есть "совершенно" останетсяна одной строке, а "разной длины" перенесётся на новую строку
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2020, 16:29
Ответы с готовыми решениями:

Определить среднюю длину строк в тексте и вывести строки с длиной меньше средней
определить среднюю длину строк и вывестис длиной меньше средней я даже приблизительно немогу...

В тексте из N строк выровнять строки так, чтобы каждая строка имела длину 65 символов
выравнивание строк:в тексте из N строк выровнять строки так,чтобы каждая строка имела длину 65...

Ограничить длину текста в JLabel
Здравствуйте. У своей формы я сделал строку состояния: поместил вниз формы тулбар, прикрепил его к...

Как ограничить длину string?
Для char я знаю, а для string-a не понятно... надо просто ограничить число символов для ввода.

33
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
26.12.2020, 17:36 2
Приложите к сообщению имеющийся текст и количество желаемых символов в строке.
0
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
26.12.2020, 17:57  [ТС] 3
maxlen=150

Текстовый файл прилагаю
Вложения
Тип файла: txt Томат Настенька.txt (5.1 Кб, 7 просмотров)
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
26.12.2020, 18:15 4
Цитата Сообщение от giaber Посмотреть сообщение
maxlen=150
Ясно, а minlen ? Раз, не символы, то у строки должна быть минимальная длина.
0
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
26.12.2020, 19:07  [ТС] 5
минимум любой то есть вплоть до пустой строки

Добавлено через 3 минуты
нет неправильно говорю - о минимуме речи нет все остальные строки которые меньше maxlen остаются нетронутые, изменять (разбивать) надо только строки бОльшие maxlen
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
26.12.2020, 19:15 6
Лучший ответ Сообщение было отмечено I can как решение

Решение

Вот, от нечего делать, написал. Это пропорциональное выравнивание пробелами по задаваемой ширине:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
Function alignByWidth(Stri As String, w As Integer) As String()
Dim Res() As String
Dim Ws()  As String
Dim Bl()  As Integer
 
    ReDim Ws(1 To w) As String
    ReDim Bl(1 To w) As Integer
 
    Tmp = Split(Stri$, " ")
 
    sz% = 100 '::: Начальный размер строкового буфера
 
    ir% = 1
    ReDim Res(1 To sz%) As String
    
    iw% = 0
    ww% = 0
    
    For i% = 0 To UBound(Tmp)
        
        wd$ = CStr(Tmp(i%))
        
        If Len(wd$) > 0 Then
        
           ww% = ww% + Len(wd$) + 1
           
           If ww% > w Then
           
              s_b% = 0
              s_w% = 0
              Bl(iw%) = 0
              
              For j% = 1 To iw%
                  s_b% = s_b% + Bl(j%)
                  s_w% = s_w% + Len(Ws(j%))
              Next j%
           
              df% = w - s_w% - s_b%
              
              ii% = 1
              Do
              
                 Bl(ii%) = Bl(ii%) + 1
                 df% = df% - 1
                 If df% = 0 Then Exit Do
                 ii% = ii% + 1
                 If ii% = iw% Then ii% = 1
              
              Loop
           
              Buf$ = ""
           
              For ii% = 1 To iw%
                  Buf$ = Buf$ + Ws(ii%) + Space$(Bl(ii%))
              Next ii%
              
              Res(ir%) = Buf$
              ir% = ir% + 1
              
              If ir% > sz% Then
              
                 sz% = sz% + 100
                 
                 ReDim Preserve Res(1 To sz%) As String
              
              End If
              
              For ii% = 1 To w
                  Ws(iw%) = ""
                  Bl(iw%) = 0
              Next ii%
              
              Ws(1) = wd$
              Bl(1) = 1
              iw% = 1
              ww% = Len(wd$) + 1
           
           Else
           
              iw% = iw% + 1
              Ws(iw%) = wd$
              Bl(iw%) = 1
              
           End If
        
        End If
 
     Next i%
 
     If iw% >= 1 Then  '::: Чтобы не пропадало последнее слово (если оно единственное)
     
        Buf$ = ""
        For ii% = 1 To iw%
            Buf$ = Buf$ + Ws(ii%) + " "
        Next ii%
     
        Res(ir%) = Buf$
     
     End If
 
     ReDim Preserve Res(1 To ir%) As String
 
     alignByWidth = Res
 
End Function
 
Sub Test()
Dim X() As String
 
    Txt$ = "Однажды в студеную зимнюю пору я из лесу вышел. Был сильный мороз. Гляжу, поднимается медленно в гору" + _
           " лошадка, везущая хворосту воз."
        
    X = alignByWidth(Txt$, 45)
    
    For i% = 1 To UBound(X)
        Debug.Print X(i%)
    Next i%
    
End Sub
3
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
26.12.2020, 19:19 7
Результат работы при w=45, 35, 55 - на картинке
Миниатюры
Ограничить длину строк в тексте  
1
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
26.12.2020, 19:26  [ТС] 8
Catstail - спасибо! Код интересный и наверняка пригодится но к сожалению это не то что мне нужно сейчас

Кстати у меня последнее слово "воз" не печатается
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
26.12.2020, 21:01 9
Лучший ответ Сообщение было отмечено giaber как решение

Решение

Цитата Сообщение от Catstail Посмотреть сообщение
от нечего делать, написал
Вы уж больно быстро. Я ещё долго бы думал.....
Использовал вашу функцию. Всё, вроде бы нормально.
Вложения
Тип файла: zip Split.zip (10.4 Кб, 11 просмотров)
3
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
26.12.2020, 21:10 10
Цитата Сообщение от giaber Посмотреть сообщение
минимум любой то есть вплоть до пустой строки
Смысл в ограничении максимума. Если вы установите максимум, равным нулю, то получится ерунда.
Т.е. речь о "защите от дурака". В программе для себя, не важно, а в программе для всех, защиту надо ставить на максимум, чтобы он был в разумных пределах. Допустим, от 10 до 159 или как-то ещё.
В вышеприведённой программе, защиты нет. Максимальный размер буфера в функции Catstail, установлен 100, я увеличил до 200. Т.е. если максимальный размер строки будет больше 200, то программа "сломается".
0
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
26.12.2020, 21:37  [ТС] 11
Catstail, Argus19 - как-то мне сложным показался ваш подxод я предполагал что-то такого типа:
строка - наш текст
start = 1
при помощи substringLen=InStr(start, строка, vbCrLf) ищем следующий vbCrLf
если substringLen < maxlen то тогда start = substringLen + 1 и опять ищем следующий vbCrLf
если substringLen > maxlen то тогда ищем последний пробел в отрезке от start до start + maxlen (как?) и делаем Replace вместо пробела пробел+vbCrLf и start = start + maxlen и всё опять повторяется
по какому условию заканчивать этот цикл не соображаю

в общем что-то такого типа но пытаясь реализовать это я застрял и туплю до сиx пор
Что скажете, други?
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
26.12.2020, 21:45 12
Цитата Сообщение от giaber Посмотреть сообщение
как-то мне сложным показался ваш подxод
Скачайте программу и посмотрите результат. Напишите. что не нравится.
0
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
26.12.2020, 21:52  [ТС] 13
некоторые ошибки есть в том алгоритме что я написал но надеюсь вы поняли мой ламерский бред

Добавлено через 5 минут
Да нет же! Всё работает, спасибо БОЛЬШОЕ! но чисто от шизы - xочется покороче
0
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
26.12.2020, 22:05 14
Цитата Сообщение от giaber Посмотреть сообщение
в общем что-то такого типа но пытаясь реализовать это я застрял и туплю до сиx пор
Я сам начал с поиска точки и то же застрял.
Первая длинная строка в вашем тексте состоит из 400 с лишним символов и в неё входит несколько предложений, которые надо укоротить до нужной длины. Функция Split возвращает массив строк. Берём первую строку и, если она длиннее указанного размера, то надо её разбить. Функцией InstrRev найти пробел, по номеру его вхождения прикинуть длину строки и, если не устраивает, то искать опять с новой позиции. Выделить строку, соответствующую нужной длине и записать в переменную. В другую переменную записать остаток строки. Получить из массива следующую строку, в начало её вставить огрызок из переменной и повторить предыдущий геморрой и т.д.
Как-то так.
0
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
26.12.2020, 22:16  [ТС] 15
OK Всё понятно Ещё раз большое спасибо за помощь!
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,614
Записей в блоге: 13
26.12.2020, 22:39 16
Цитата Сообщение от giaber Посмотреть сообщение
Кстати у меня последнее слово "воз" не печатается
- я поправил в строке 90
0
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
26.12.2020, 22:41  [ТС] 17
ОК Спасибо!

Но я всё-таки пытаюсь закончить свой вариант
1
533 / 375 / 76
Регистрация: 24.09.2017
Сообщений: 2,108
Записей в блоге: 13
26.12.2020, 23:10 18
Цитата Сообщение от giaber Посмотреть сообщение
Но я всё-таки пытаюсь закончить свой вариант
Удачи!
Вот почти профессиональный вариант:
Вложения
Тип файла: zip Split Text File.zip (38.5 Кб, 12 просмотров)
1
738 / 552 / 141
Регистрация: 27.01.2019
Сообщений: 1,243
27.12.2020, 01:25 19
Argus19, Catstail, Отличная программа и нужная!Только у меня вопрос,почему при задании малой длины,тех же 20,в строке
Visual Basic
1
 Bl(ii%) = Bl(ii%) + 1
вылезает ошибка "не соответствие индексов"?
0
18 / 13 / 0
Регистрация: 16.09.2014
Сообщений: 302
27.12.2020, 07:19  [ТС] 20
Тут мне такая мысль пришла в голову - если мы используем регулярку:
Visual Basic
1
2
3
' определяем наличие vbCrLf
objRegExp.Pattern = "vbCrLf"  '
Set objMatches = objRegExp.Execute(MyString) '
то мы сразу имеем:
Visual Basic
1
2
3
4
5
6
количество vbCrLf в тексте: 
objMatches.Count
 
все позиции vbCrLf
от первой - FirstPos = objMatches.Item(0).FirstIndex ' 
до последней - LastPos = objMatches.Item( - 1).FirstIndex '
таким образом для того чтобы определить нужные места для vbCrLf, нам придётся манипулировать числами а не текстом и просто в цикле Replace-ом вставлять vbCrLf

Может кто-нибудь возьмёт на себя труд реализовать этот подxод - я ведь дня 2-3 буду делать при моей ламерности

Добавлено через 8 минут
Забыл написать что и позиции всеx пробелов тоже узнаём
0
27.12.2020, 07:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2020, 07:19
Помогаю со студенческими работами здесь

ограничить длину числа в Edit Control
Добрый день! мне необходимо ограничить длину числа в Edit Control. Отрицательное число на 1 знак...

Не удается ограничить длину строки в TextBox
Уважаемые Гуру! Не получается ограничить длину строки в TextBox. TextBox находится в grid с двумя...

Как ограничить длину вводимого текста?
примечание модератора: начало обсуждения в этой теме а как правильно уменьшить строку? то есть...

Ограничить длину строки в listBox и listView
Здравствуйте! Подскажите как установить максимальную длину текста элемента в listBox и listView

Как ограничить длину вводимой строки?
Короче, есть задачка: Напишите программу на &quot;родном&quot; С++, которая читает с клавиатуры число...

Ограничить длину текста в анонсе записи WordPress
Есть код, отвечающий за вывод сообщения на странице вывода анонсов записи: &lt;?php echo...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru