Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429

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

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

Студворк — интернет-сервис помощи студентам
Имеется некий текст в которм строки совершенно разной длины (есть и пустые строки то есть просто перенос на новую строку vbCrLf ). Нужно чтобы ни одна строка в тексте не превышала заданную длину maxlen, но так, чтобы слова не разделялись, то есть если разделение символом vbCrLf придётся посреди слова, например "совершенно раз/ной длины", то строка должна разделиться по пробелу перед словом на которое пришлось разделение:"совершенно /разной длины" то есть "совершенно" останетсяна одной строке, а "разной длины" перенесётся на новую строку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2020, 16:29
Ответы с готовыми решениями:

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

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

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

33
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,527
Записей в блоге: 22
26.12.2020, 17:36
Приложите к сообщению имеющийся текст и количество желаемых символов в строке.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
26.12.2020, 17:57  [ТС]
maxlen=150

Текстовый файл прилагаю
Вложения
Тип файла: txt Томат Настенька.txt (5.1 Кб, 7 просмотров)
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,527
Записей в блоге: 22
26.12.2020, 18:15
Цитата Сообщение от giaber Посмотреть сообщение
maxlen=150
Ясно, а minlen ? Раз, не символы, то у строки должна быть минимальная длина.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
26.12.2020, 19:07  [ТС]
минимум любой то есть вплоть до пустой строки

Добавлено через 3 минуты
нет неправильно говорю - о минимуме речи нет все остальные строки которые меньше maxlen остаются нетронутые, изменять (разбивать) надо только строки бОльшие maxlen
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,721
Записей в блоге: 14
26.12.2020, 19:15
Лучший ответ Сообщение было отмечено 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
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,721
Записей в блоге: 14
26.12.2020, 19:19
Результат работы при w=45, 35, 55 - на картинке
Миниатюры
Ограничить длину строк в тексте  
1
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
26.12.2020, 19:26  [ТС]
Catstail - спасибо! Код интересный и наверняка пригодится но к сожалению это не то что мне нужно сейчас

Кстати у меня последнее слово "воз" не печатается
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,527
Записей в блоге: 22
26.12.2020, 21:01
Лучший ответ Сообщение было отмечено giaber как решение

Решение

Цитата Сообщение от Catstail Посмотреть сообщение
от нечего делать, написал
Вы уж больно быстро. Я ещё долго бы думал.....
Использовал вашу функцию. Всё, вроде бы нормально.
Вложения
Тип файла: zip Split.zip (10.4 Кб, 11 просмотров)
3
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,527
Записей в блоге: 22
26.12.2020, 21:10
Цитата Сообщение от giaber Посмотреть сообщение
минимум любой то есть вплоть до пустой строки
Смысл в ограничении максимума. Если вы установите максимум, равным нулю, то получится ерунда.
Т.е. речь о "защите от дурака". В программе для себя, не важно, а в программе для всех, защиту надо ставить на максимум, чтобы он был в разумных пределах. Допустим, от 10 до 159 или как-то ещё.
В вышеприведённой программе, защиты нет. Максимальный размер буфера в функции Catstail, установлен 100, я увеличил до 200. Т.е. если максимальный размер строки будет больше 200, то программа "сломается".
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
26.12.2020, 21:37  [ТС]
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
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,527
Записей в блоге: 22
26.12.2020, 21:45
Цитата Сообщение от giaber Посмотреть сообщение
как-то мне сложным показался ваш подxод
Скачайте программу и посмотрите результат. Напишите. что не нравится.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
26.12.2020, 21:52  [ТС]
некоторые ошибки есть в том алгоритме что я написал но надеюсь вы поняли мой ламерский бред

Добавлено через 5 минут
Да нет же! Всё работает, спасибо БОЛЬШОЕ! но чисто от шизы - xочется покороче
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,527
Записей в блоге: 22
26.12.2020, 22:05
Цитата Сообщение от giaber Посмотреть сообщение
в общем что-то такого типа но пытаясь реализовать это я застрял и туплю до сиx пор
Я сам начал с поиска точки и то же застрял.
Первая длинная строка в вашем тексте состоит из 400 с лишним символов и в неё входит несколько предложений, которые надо укоротить до нужной длины. Функция Split возвращает массив строк. Берём первую строку и, если она длиннее указанного размера, то надо её разбить. Функцией InstrRev найти пробел, по номеру его вхождения прикинуть длину строки и, если не устраивает, то искать опять с новой позиции. Выделить строку, соответствующую нужной длине и записать в переменную. В другую переменную записать остаток строки. Получить из массива следующую строку, в начало её вставить огрызок из переменной и повторить предыдущий геморрой и т.д.
Как-то так.
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
26.12.2020, 22:16  [ТС]
OK Всё понятно Ещё раз большое спасибо за помощь!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,721
Записей в блоге: 14
26.12.2020, 22:39
Цитата Сообщение от giaber Посмотреть сообщение
Кстати у меня последнее слово "воз" не печатается
- я поправил в строке 90
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
26.12.2020, 22:41  [ТС]
ОК Спасибо!

Но я всё-таки пытаюсь закончить свой вариант
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,527
Записей в блоге: 22
26.12.2020, 23:10
Цитата Сообщение от giaber Посмотреть сообщение
Но я всё-таки пытаюсь закончить свой вариант
Удачи!
Вот почти профессиональный вариант:
Вложения
Тип файла: zip Split Text File.zip (38.5 Кб, 12 просмотров)
1
Любитель
 Аватар для Тим70
1042 / 748 / 161
Регистрация: 27.01.2019
Сообщений: 1,516
27.12.2020, 01:25
Argus19, Catstail, Отличная программа и нужная!Только у меня вопрос,почему при задании малой длины,тех же 20,в строке
Visual Basic
1
 Bl(ii%) = Bl(ii%) + 1
вылезает ошибка "не соответствие индексов"?
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
27.12.2020, 07:19  [ТС]
Тут мне такая мысль пришла в голову - если мы используем регулярку:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2020, 07:19
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru