Как объединить несколько текстовых файлов в один?
Проблема сбора данных с текстовых файлов в один общий не такая распространенная, как сбор данных из нескольких файлов/листов в Excel, но все же она периодически возникает. Поэтому в этой статье просто делюсь решением, как это можно сделать при помощи не самого хитрого код. Все, что потребуется - это нажать кнопку и выбрать нужные файлы: текстовые или CSV. Далее небольшие настройки:
сначала появится запрос "Оставлять только один заголовок(первого файла)" - если указать ДА(YES), то в итоговом файле будет только один заголовок, из первого файла. Заголовки всех остальных файлов будут пропущены. Необходимо, когда в каждом из текстовых файлов есть заголовки и их включать в общий файл не требуется.
И если выбрано пропускать заголовки, то появится запрос - "Сколько строк в заголовке?". Нужно в случаях, если в текстовых файлов заголовки состоят более чем из одной строки(бывают и по 10 строк).
'--------------------------------------------------------------------------------------- ' Author : Щербаков Дмитрий(The_Prist) ' Профессиональная разработка приложений для MS Office любой сложности ' Проведение тренингов по MS Excel ' https://www.excel-vba.ru ' info@excel-vba.ru ' Purpose: Процедура сбора данных с указанных текстовых файлов, оставляя только один заголовок '--------------------------------------------------------------------------------------- Option Explicit Sub GetAllTxt_SkipHeader() Dim avFiles, li As Long, lHeadLinesCount As Long, lh As Long Dim objFSO As Object, objTxtFile As Object, sTxt, sAllTxt Dim IsSkipHeader As Boolean Dim sToSavePath, sNewLine As String 'диалог выбора текстовых файлов. Подробнее: ' https://www.excel-vba.ru/chto-umeet-excel/dialogovoe-okno-vybora-fajlovpapki/ avFiles = Application.GetOpenFilename("TXT files(*.txt),*.txt,CSV files(*.csv),*.csv", , , , True) If VarType(avFiles) = vbBoolean Then Exit Sub 'диалог выбора папки для сохранения файла. Подробнее: ' https://www.excel-vba.ru/chto-umeet-excel/dialogovoe-okno-vybora-fajlovpapki/#saveas sToSavePath = Application.GetSaveAsFilename( _ InitialFileName:=ThisWorkbook.Path, _ FileFilter:="Text files(*.txt),*.txt", _ FilterIndex:=1, _ Title:="Сохранить файл как") 'если нажали Отмена - завершаем процедуру ничего не сохраняя If VarType(sToSavePath) = vbBoolean Then Exit Sub End If IsSkipHeader = MsgBox("Пропускать заголовки в файлах, оставив только один (из первого файла)?" & vbNewLine & _ vbTab & "ДА - в итоговый файл будет записан заголовок из первого файла. Заголовки остальных файлов будут пропущены." & vbNewLine & _ vbTab & "НЕТ - копируются все данные всех файлов, независимо от наличия или отсутствия в них заголовков", _ vbQuestion + vbYesNo, "www.excel-vba.ru") = vbYes If IsSkipHeader Then lHeadLinesCount = Val(InputBox("Сколько строк в заголовке?", "www.excel-vba.ru", 1)) End If Set objFSO = CreateObject("Scripting.FileSystemObject") For li = LBound(avFiles) To UBound(avFiles) 'открываем текстовый файл Set objTxtFile = objFSO.OpenTextFile(avFiles(li), 1) 'если заголовок уже записан и указано оставлять только один заголовок 'пропускаем строки заголовков для 2-го и последующих файлов If IsSkipHeader Then If li > LBound(avFiles) Then For lh = 1 To lHeadLinesCount objTxtFile.skipline Next End If End If 'считываем все данные файла sTxt = objTxtFile.ReadAll If sAllTxt = "" Then sAllTxt = sTxt Else sNewLine = vbNullString If Right(sAllTxt, 1) <> vbLf And Right(sAllTxt, 1) <> vbCr Then sNewLine = vbCr End If sAllTxt = sAllTxt & sNewLine & sTxt End If 'закрываем текстовый файл objTxtFile.Close Next li 'создаем новый файл и записываем в него все считанные с файлов данные Set objTxtFile = objFSO.CreateTextFile(sToSavePath, True) objTxtFile.WriteLine sAllTxt objTxtFile.Close Set objTxtFile = Nothing Set objFSO = Nothing MsgBox "Данные всех файлов собраны и сохранены в файл: '" & sToSavePath & "'", vbInformation, "www.excel-vba.ru" End Sub |
Так же можно создать кнопку на листе для вызова кода: Как создать кнопку для вызова макроса на листе?.
После работы кода в выбранной папке создан новый текстовый файл(с указанным во втором диалоговом окне именем), в котором и будут содержаться данные всех выбранных файлов.
Объединить все текстовые файлы.xls (60,0 KiB, 5 943 скачиваний)
Так же см.:
Сбор данных с нескольких листов/книг
Как собрать данные с нескольких листов или книг?
Статья помогла? Поделись ссылкой с друзьями!
Поиск по меткам
Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистикаКомментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум
А что можно сделать с docx? Мне нужно объединить файлы docx в один docx.
Иван, статья про текстовые файлы. Документы Word к ним совершенно не относятся и код будет совершенно иным.
Так что не надо закидывать тему своими однотипными комментариями с указанием своих пожеланий. Для подобных вопросов есть форум - задайте свой вопрос там.
Здравствуйте Дмитрий!
Макрос отлично работает. Но хотелось бы чтоб все файлы объеденились со второй строки т.е. без шапки.
Для этого проще открывать текстовые файлы через Excel, а собирать с помощью кода из этой статьи:Как собрать данные с нескольких листов или книг?
Текстовые можно проще собрать - пишем bat или cmd файл с примерно таким текстом (возможны варианты):
@echo off
copy /b *.txt C:\temp\all.txt
Все txt из папки с этим командным файлом будут слиты в один файл. Если этот bat/cmd выполнить конечно...
Доброго времени суток!
Скачал файл, поменял расширение в фильтре и в расширении файла all на csv. Все работает, но только до того момента, пока li не становится равной 76. потом по строке sTXT = objTxtFile.ReadAll выходит ошибка 62. Файлов всего подцеплялось 193. Что может быть? Меньшее количество файлов обрабатывает нормально без вопросов
Спасибо, облегчили работу!
Здравствуйте
Не подскажете как импортировать из текстового файла весь текст в одну ячейку?
есть столбец с примерно 200 именами файлов.
Нужно получить столбец с содержимым файлов.
Заранее спасибо.
спасибо большое за ваши решения, в какой раз нахожу для себя решения мох задач.
Огромное спасибо, Дмитрий! Вы мне очень помогли.