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

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

17.09.2023, 16:37. Показов 641. Ответов 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
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 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
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 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
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 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
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 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-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru