С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Есть ли быстрый способ преобразования массива строк в одну большую строку?

17.09.2023, 16:37. Показов 617. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли быстрый способ преобразования массива строк в одну большую строку?

У меня есть массив строк - это список файлов на винчестере, их много, больше 10 тысяч. Если мне потребуется сохранить этот список файлов в TXT файл то мне придётся составить одну большую строку для сохранения. Приходит на ум только следующий простой код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Global files_list() As String
Dim i As Long
Dim str As String
 
For i = 0 To UBound(files_list)
        If i <> UBound(files_list) Then
            str = str & files_list(i) & vbNewLine
        Else
            str = str & files_list(i)
        End If
    Next
Но эта процедура для 10 тысяч строк занимает ажно целых 5 секунд. Слишком долго. Хотя сохранение на диск дальше мгновенное. Я вот всё думаю: а есть ли способ преобразовать массив строк в одну большую длинную строку как-нибудь побыстрее?

Добавлено через 7 минут
Прикол в том, что если бы я записывал файл в ANSI кодировку через стандартные методы VB6 то файл записался бы мгновенно, вот таким кодом:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim i As Integer
    Dim FileNo As Integer
    
    ' Инициализировать счётчик
    FileNo = FreeFile
        
    ' Открыть файл для записи в него данных
    Open AppPath + "\Set Wallpaper Plus.dat" For Output As FileNo
        For i = 0 To UBound(files_list)
            If i <> UBound(files_list) Then
                Print #FileNo, files_list(i) ' Записывать в файл строки из массива
            Else
                Print #FileNo, files_list(i); ' Записать в файл последнею строку
            End If
        Next
    Close FileNo ' Закрыть файл по завершении записи в него данных
Добавлено через 39 секунд
Но я не могу сделать тоже самое для записи UTF-8

Добавлено через 35 секунд
Чтобы записать файл в UTF8 я должен иметь одну большую строку либо байтовый массив что почти одно и тоже
А у меня массив строк именно

Добавлено через 2 минуты
Поэтому я в недоумении что мне делать

Добавлено через 15 минут
На ум приходит только clsStringBuilder громоздкий
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2023, 16:37
Ответы с готовыми решениями:

Самый быстрый способ склеивания строк
Закешировал файл в строку, десериализовал данные в массив экземпляров специально созданного класса. Далее обработал данные, и пытаюсь опять...

Есть ли простой способ удалить строку из массива (не из матрицы чисел)
Здравствуйте! Прошу помочь разобраться: есть ли простой способ удалить строку(столбец) из массива разнородных элементов (не из матрицы...

Самый быстрый способ масовой вставки строк
Допустим если надо вставить около тысячи строк, под одной - очень долго, может быть кто-то сможет предложить более быстрый способ?

8
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
17.09.2023, 16:41
Ты же мне давал коды, там вроде бы join просто с дурной скоростью, по моему этот сообщений
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.09.2023, 16:45  [ТС]
testuser2, я просто забыл что такое Join если честно
0
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
17.09.2023, 17:05
HackerVlad, еще можно сразу в одну большую строку писать весь спок, с помщью того же mid-а..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.09.2023, 17:24  [ТС]
Короче говоря clsStringBuilder не нужен, достаточно просто Join даже стандартный VB'шный работает достаточно быстро для 600КБ

Добавлено через 57 секунд
10 тысяч строк теперь сохраняет мгновенно

Добавлено через 1 минуту
Почему строка = строка + добавка работает так медленно... непонятно...
0
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
17.09.2023, 17:39
Цитата Сообщение от HackerVlad Посмотреть сообщение
Почему строка = строка + добавка работает так медленно... непонятно...
потому что при каждой прибавке происходит полная перезапись (пересоздание) единой большой строки, а правилно когда, сначала создается большой блок и в него все пишется, сам блок уже не пресоздается.

Добавлено через 2 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
10 тысяч строк
10 тыс. это даже для vba смешная цифра
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.09.2023, 17:48  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
10 тыс. это даже для vba смешная цифра
тем ни менее, строка = строка + добавка занимала целых 5 секунд времени! боюсь представь что было бы, если бы было миллион строк...

Добавлено через 4 минуты
Вот как работает Join

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Command1_Click()
    Dim strs(2) As String
    Dim str As String
    
    strs(0) = "str1"
    strs(1) = "str2"
    strs(2) = "str3"
    
    str = Join(strs, vbCrLf)
    Text1.Text = str
End Sub
Добавлено через 39 секунд
При десяти тысячах в цикле почти мгновенно обрабатывает кстати
0
1383 / 838 / 90
Регистрация: 08.02.2017
Сообщений: 3,511
Записей в блоге: 1
17.09.2023, 17:48
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вот как работает Join
оставь это для детей )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
23.09.2023, 15:23  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
оставь это для детей
Это не для детей, а для тех людей которые будут читать эту тему и искать решение.

Добавлено через 1 минуту
Так же решением является класс clsStringBuilder. Но вариант с функцией Join меня устраивает больше, так как не нужно писать много кода. И исполняемый файл EXE в конечном итоге будет весить меньше.

Добавлено через 1 минуту
Хотя Join может быть медленнее, если не использовать самописный быстрый. Поэтому тут тоже под каждую задачу наилучшим может быть разное решение. В моём же случае 10 тысяч строк обрабатывает даже встроенный Join достаточно быстро, почти мгновенно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2023, 15:23
Помогаю со студенческими работами здесь

Есть ли быстрый способ увеличить все элементы матрицы на 1
Здравствуйте. я сейчас делаю это так for (int i = 0; i &lt; 10; ++i) for (int j = 0; j &lt; 10; ++j) matr++;...

Быстрый способ подсчитать количество строк, удовлетворяющих условию
Здравствуйте, подскажите пожалуйста быстрый способ подсчитать количество строк удовлетворяющих условию в очень большом текстовом файле....

Есть ли быстрый способ проверки значения в таблице из кода VBA?
На форме есть поле, пользователь вводит некое значение, хочется сразу его проверять, не присутствует ли оно уже в какойто определённой...

Наиболее быстрый способ работы с файлом Excel (около 20000 строк)
Здравствуйте ребята, хотел спросить у вас совета. Есть программа по распечатке ценников по артикулу или штрихкоду товара. Какой обработкой...

Разбить одну большую строку, на строчки)
Всем привет! Подскажите пожалуйста, как разбить вот примерно тааааааааакую строку...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru