С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/89: Рейтинг темы: голосов - 89, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 23.10.2017
Сообщений: 6

Перенос данных из текстовых файлов в excel

24.10.2017, 00:13. Показов 17821. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем дня!
Помогите, пожалуйста с решением проблемы!
Есть множество txt файлов, нужно при помощи макроса перенести данные из этих файлов в Ексель с разбивкой по столбцам. Если подробней, то текстовый файл содержит порядка 15 строк, нужно эти строки перенести в отдельные столбцы ексель, далее взять следующий текстовый файл и также, только с новой строки, разбить его на столбцы в этот же ексель под данными предыдущего текстового файла и так далее. Формат текстового файла приблизительно такой:
текст1: значение1
Текст2: значение2 и т.д.
В идеале конечно же было копировать значения только после ":пробел", но хотя бы всю строку. Моих познаний хватило только на макрос с разбивкой одного файла на столбцы и то подсмотрел на форуме. В макросах совсем не силен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2017, 00:13
Ответы с готовыми решениями:

Перенос данных из файлов Word в Excel
Добрый день! В общем задача следующего типа. В папке хранятся файлы MS Word c данными о сотрудниках, заполненные по стандартному шаблону....

Перенос данных из нескольких файлов excel в один
Как из множества файлов Excel перенести значения в одну сводную таблицу в отдельном файле? Суть в том, что людям рассылаются анкеты в...

Перенос однотипных данных из 20 файлов более 15млн строк Excel в Access
Добрый день, Есть 15 файлов Excel. В каждом файле есть от одной до 3 вкладок. На каждой вкладке находятся данные на 700-800к строк....

40
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
24.10.2017, 08:13
SaylerZ,
выложите файл TXT
а перед выкладыванием замените в нем данные на "левые"
и желательно файл excel c данными какими они должны получиться
0
0 / 0 / 0
Регистрация: 23.10.2017
Сообщений: 6
24.10.2017, 22:33  [ТС]
Во вложении пример. Грубо говоря, все строки из первого txt нужно перенести в столбцы в ексель. Далее из второго txt в этот же ексель все строки в столбцы, но уже с новой строки и так далее. Желательно конечно, чтобы данные брались после ":пробел".
Вложения
Тип файла: txt Пример.txt (92 байт, 91 просмотров)
Тип файла: xlsx Пример.xlsx (8.8 Кб, 75 просмотров)
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
25.10.2017, 13:31
И что, во всех файлах именно в таком порядке есть все позиции? И ничего более? Из практики такого не бывает
Я делал так - сперва в словаре собирал коллекции или кажется другие словари данных из всех текстовых файлов, и уже затем раскладывал всё на лист.

Добавлено через 13 часов 37 минут
Да, и если нужен именно перенос - после удачно выполненного копирования все текстовые файлы убить!
0
0 / 0 / 0
Регистрация: 23.10.2017
Сообщений: 6
26.10.2017, 22:47  [ТС]
Да, во всех файлах одинаковые позиции. Все файлы однотипные, там позиций 20. Всё что до ":" не меняется, меняются только значения после ":".

Добавлено через 26 секунд
Да, во всех файлах одинаковые позиции. Все файлы однотипные, там позиций 20. Всё что до ":" не меняется, меняются только значения после ":".
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
26.10.2017, 23:07
Тогда проще, тогда можно без словаря - открыли в цикле по одному все тексты, скопировали данные в очередную строку.

Добавлено через 18 минут
Вот например, переделал что первое попалось:
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
Sub tt()
 
    Dim FSO
    Dim TheFolder, TheFiles, AFile, i&, el
 
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set TheFolder = FSO.GetFolder("e:\tmp\SaylerZ\")
    Set TheFiles = TheFolder.Files
    
    i = 10 'тут можно указать с какой строки начинать выгрузку
    For Each AFile In TheFiles
        If UCase(FSO.GetExtensionName(AFile.Path)) = "TXT" Then
            i = i + 1: ii = 0
            For Each el In Split(ReadTXTfile(AFile.Path), vbNewLine)
                ii = ii + 1
                Cells(i, ii) = Split(el, ":")(1)
            Next
        End If
    Next
 
End Sub
 
Function ReadTXTfile(ByVal filename As String) As String
    Set FSO = CreateObject("scripting.filesystemobject")
    Set ts = FSO.OpenTextFile(filename, 1, True): ReadTXTfile = ts.ReadAll: ts.Close
    Set ts = Nothing: Set FSO = Nothing
End Function
Надеюсь понятно где прописан путь к тестовым файлам?
0
0 / 0 / 0
Регистрация: 23.10.2017
Сообщений: 6
26.10.2017, 23:34  [ТС]
Протестил, вроде всё огонь. Спасибо большое!
Единственное пару моментов уточнить хотелось бы)
Если допустим будет в txt через одну строчку запись, типа:
Имя: Иван

Фамилия: Иванов
то уже не попрет макрос я так понимаю.
Или же в строчки не будет ":", тоже будет ошибка.
А есть возможность предусмотреть эти 2 условия.
Или как вариант прописать выполнять эти действия до определенной строчки в txt файле.

Добавлено через 2 минуты
Уточню, там где нет ":" сточка вообще не нужна, или же если будет пропуск между строчками, то приступать сразу к следующему txt файлу.
Вполне достаточно второго условия.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
26.10.2017, 23:36
Так Вы ведь уверяли что там всё чётко... Так что теперь уж извините, переделывать не буду
Ну выкинуть пустую строку легко - просто после 14-й строки проверяем что в el есть значение, если есть, то увеличиваем переменную и пишем на лист.
Но уверен что не всё так просто... но об этом я уже говорил.
0
0 / 0 / 0
Регистрация: 23.10.2017
Сообщений: 6
26.10.2017, 23:39  [ТС]
А на сколько трудоемко написать условие: "если будет пропуск между строчками, то приступать сразу к следующему txt файлу."
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
26.10.2017, 23:44
Да не особо сложно...
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
Sub tt()
 
    Dim FSO
    Dim TheFolder, TheFiles, AFile, i&, el
 
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set TheFolder = FSO.GetFolder("e:\tmp\SaylerZ\")
    Set TheFiles = TheFolder.Files
 
    i = 10    'тут можно указать с какой строки начинать выгрузку
    For Each AFile In TheFiles
        If UCase(FSO.GetExtensionName(AFile.Path)) = "TXT" Then
            i = i + 1: ii = 0
            For Each el In Split(ReadTXTfile(AFile.Path), vbNewLine)
                If Len(el) Then
                    ii = ii + 1
                    Cells(i, ii) = Split(el, ":")(1)
                Else
                    Exit For
                End If
            Next
        End If
    Next
 
End Sub
0
0 / 0 / 0
Регистрация: 23.10.2017
Сообщений: 6
26.10.2017, 23:52  [ТС]
Ну всё очень круто Спасибо огромное, завтра протестирую в боевых условиях.
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
26.02.2021, 13:30
Hugo121,
Цитата Сообщение от Hugo121 Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub tt()
i = 10
   For Each AFile In TheFiles
        If UCase(FSO.GetExtensionName(AFile.Path)) = "TXT" Then
            i = i + 1: ii = 0
            For Each el In Split(ReadTXTfile(AFile.Path), vbNewLine)
                ii = ii + 1
                Cells(i, ii) = Split(el, ":")(1)
            Next
   End If
Next
End Sub
Вот бы понять, как это работает
Пытаюсь под свои реали перебрать это
Visual Basic
1
2
3
4
5
i = i + 1: ii = 0
For Each el In Split(ReadTXTfile(AFile.Path), vbNewLine)
   ii = ii + 1
   Cells(i, ii) = Split(el, ":")(1)
Next
Но вот этот кусок вообще не поддается

Что я понял,
Для каждого файла с маской *TXT* применить следующие:
Файл начинает читаться VBA ... а дальше магия какая то происходит, написанная на эльфийском
0
малоболт
1328 / 510 / 213
Регистрация: 30.01.2020
Сообщений: 1,244
26.02.2021, 19:17
Цитата Сообщение от blackfisk Посмотреть сообщение
For Each el In Split(ReadTXTfile(AFile.Path), vbNewLine)
sss = ReadTxtFile() - читает весь файл целиком в переменную sss. Если не записывать его в переменную, а сразу разбить на элементы массива то содержимое файла, что возвращает эта функция, используя в качестве разделителя символы Перевода каретки (vbCR) и Перевода строки (vbLF) (в паре обозначенные переменной vbNewLine=vbCR&vbLF), то получим массив строк, аналогичный тому, как если бы мы читали файл построчно, занося каждую строку в новый элемент массива.
то есть эта строка аналогична
Visual Basic
1
2
3
4
5
6
7
 
  sss = ReadTxtFile() 'читаем весь файл целиком в переменную sss
  arrStrings = Split(sss,vbNewLine) 'разбиваем на массив строк
  for ii=0 to arrStrings.Size-1 step 1 'перебираем все строки в массиве строк
    arrWords = Split(arrStrings(ii),":") 'разбиваем каждую строку на массив слов, используя двоеточие в качестве разделителя
    Cells(i,ii) = arrWords(1) ' записываем в ячейку второй элемент массива слов (тот что после двоеточия)
  next
1
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
26.02.2021, 22:11
Visual Basic
1
For Each el In Split(ReadTXTfile(AFile.Path), vbNewLine)
перевожу:
для каждого элемента массива, который получен разбитием прочитанного файла в массив по "символу" новой строки (тут кстати могут быть варианты!)
т.е. перебираем этот массив строк и что-то далее делаем, в данном случае увеличиваем номер строки, куда выводим уже элемент массива, который получаем из этого элемента, разбив его в массив по двоеточию. Второй элемент, первый будет Split(el, ":")(0)
Посмотреть что где в какой переменной можно в окне Locals, прогоняя код пошагово, или на паузе кода.
1
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
01.03.2021, 13:05
Hugo121,
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
Sub test()
Dim myFile As String, text As String, textline As String
myFile = ThisWorkbook.Path & "\JENK.txt"
Open myFile For Input As #1
Do Until EOF(1)
    Line Input #1, textline
    text = text & textline
Loop
Close #1
 
b = 3
Range(Cells(1, 3), Cells(100, 1)).ClearContents 'Это для удобства только
 
For j = 1 To 8
 
If j = 1 Then posLat = InStr(1, text, "фаза_Jen", 1)
If j = 2 Then posLat = InStr(1, text, "фаза_Jen_прнзлы", 1)
If j = 3 Then posLat = InStr(1, text, "фаза_UpJenm", 1)
If j = 4 Then posLat = InStr(1, text, "город", 1)
If j = 5 Then posLat = InStr(1, text, "фаза_Jenh_1", 1)
If j = 6 Then posLat = InStr(1, text, "фаза_Jenh_2", 1)
If j = 7 Then posLat = InStr(1, text, "загородный", 1)
If j = 8 Then posLat = InStr(1, text, "JENK_Сумма", 1)
 
    For i = 1 To 100 'Понятия не имею, как найти конец строки, по этому пусть будет 100
        myvalue = Replace((Mid(text, posLat + i, 1) & Mid(text, posLat + i + 1, 1) & Mid(text, posLat + i + 2, 1) & Mid(text, posLat + i + 3, 1)), " ", "")
        If myvalue Like "#.##" Then
                Cells(b, 1).Value = myvalue
                b = b + 1
                GoTo nextlevel
        End If
    Next i
nextlevel:
Next j
End Sub
Сдаюсь
у меня пока выходит вытащить только число из второго столбика, т.к. оно подходит по маске, а надо из третьего
И я чувствую, что ответ де то рядом, но никак не могу понять, чего не хватает

Я по вашей схеме разбиваю txt на строки, далее ищу номер символа, который совпадает с нужной строкой
Открываю перебор и поиск символов по маске #.##, ну и забираю нужное
Но что то идет не так
Можно ли как то ориентировать код по словам? числам? мол забери третье "слово" с начала
Типа Mid(test, первый_символ_слова, последний_символ_слова)
Вот только как эти символы найти?
Вложения
Тип файла: txt JENK.txt (289 байт, 14 просмотров)
0
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,721
01.03.2021, 13:29
blackfisk, я бы так сделал:
- читаю строки файла, пока не найду "№" - это пропуск заголовков
- для строк ниже до конца файла (While Not EOF(номер_файла)) выполняю:
- заменить " " (2 пробела) на "|"
- заменить "||" на "|", пока в строке есть "||"
- теперь данные отделены одним разделителем "|" - делаем Split(строка, "|")
- вуаля - поделили на элементы
Вид после замен будет примерно такой:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
7| 
Дата|
 
Таблица
№| 
1| 1 фаза_Jen|2935|0.239| 8.16
2| 2 фаза_Jen_прнзлы| 744| 0.178| 23.98
3| 3 фаза_UpJenm| 5130|0.316| 6.16
4| город| 8808|0.734| 8.34
5| 4 фаза_Jenh_1| 7554|0.486| 6.43
6| 5 фаза_Jenh_2| 10348| 0.894| 8.64
7| загородный|17902| 1.380| 7.71
8| JENK_Сумма|26710| 2.114| 7.92
Если устроит, запишу кодом.

Добавлено через 1 минуту
Почему делаю замены, а не, к примеру, "текст по столбцам" - у вас в 1-3 и 5-6 строках наименование включает пробел (1 фаза_Jen) и тогда оно бы тоже поделилось.
1
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
01.03.2021, 13:43
Zeag,
добавить это?
Visual Basic
1
2
myvalue = Replace(" ", "|")
myvalue = Replace("||", "|")
Только я не пойму, как добраться до 4ого "|" в таком случае ?
0
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,721
01.03.2021, 13:49
Минут 10-15 подождите, я сделаю, посмотрите. Добраться по индексу.
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
01.03.2021, 13:56
Visual Basic
1
2
        myvalue = Replace(myvalue, " ", "|")
        myvalue = Replace(myvalue, "||", "|")
Я сам не знаю, что это за знаки, но они не заменяются, какая то оскверненная табуляция что ле

Добавлено через 3 минуты
У меня Trim() даже не убирает пробелы в строке :/
0
859 / 509 / 187
Регистрация: 09.03.2009
Сообщений: 1,721
01.03.2021, 13:57
Немного ошибся, у вас там табуляторы разделители, а не пробелы, но и так можно.
Вложения
Тип файла: xls jenk.xls (31.0 Кб, 20 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2021, 13:57
Помогаю со студенческими работами здесь

Обработка текстовых файлов в Excel
Доброго времени суток всем! Подскажите плз как мне открыть текстовый файлик на чтение, у которого DOS-овская кодировка. Сейчас пробую...

Перенос текстовых данных в DataGridView
Подскажите пожалуйста какой-никакой разумный способ перенести строки из столбца datagrid в лист. Создал тестовую кнопку, рич текстбокс...

Экспорт массива текстовых файлов в лист excel
Доброго времени суток, подскажите как выполнить следующую задачу. Есть определенное количество текстовых файлов с одинаковой структурой, но...

Импорт многомиллионных текстовых файлов в MS Excel средствами мастера импорта
Доброго времени суток, уважаемые обитатели форума! По работе появилась необходимость периодически импортить текстовики (*.csv) в MS...

Импорт нескольких текстовых файлов на один лист в Excel с возможностью задания маски
Здравствуйте! Нужна помощь по открытию нескольких текстовых файлов со строго определенным разделителем на один лист в Excel. При этом...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru