MyTetra Share
Делитесь знаниями!
Сбор данных из множества текстовых файлов с разделителями
Время создания: 31.07.2019 22:37
Раздел: Разные закладки - VBA
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514663581r7cs5h74j7/text.html на raw.githubusercontent.com

К примеру, есть у вас несколько десятков (или сотен) текстовых файлов с подобным содержимым:
(количество файлов, и количество строк данных в каждом файле не ограничено)

1c04;1J0-698-151-G;1 комплект тормозных накладок;1J0698151G;1J0698151G;5;1
1c04;1H0698151A;Тормозные колодки;1H0698151A;1H0698151A;1;1
1c04;1K0-698-151-B;Тормозные колодки;1K0698151B;1K0698151B;2;1

А надо из всего этого сформировать табличку в Excel - приблизительно такого вида:

На помощь придёт функция DATfolder2Array

Sub ПримерИспользованияФункции_DATfolder2Array()

Папка = "D:\Проекты\DATs\" ' папка, в которой будет производиться поиск файлов DAT для обработки

Dim ErrorsArray ' пустой массив для ошибок


' считываем данные из все файлов .DAT в папке в двумерный массив

DataArr = DATfolder2Array(Папка, 7, "1,2,4,5", ErrorsArray)

 

' результаты выводим на листы "errors" и "result" (они должны существовать)

Array2worksheet Worksheets("errors"), ErrorsArray, _

Array("Имя файла", "Номер строки", "Данные из строки")

Array2worksheet Worksheets("result"), DataArr, _

Array("Ячейка", "Штрих-Код", "Наименование", "код 1С", "код произв.", "кол-во", "счетовод")

End Sub

Код функции DATfolder2Array:

Function DATfolder2Array(ByVal FolderPath$, ByVal ColumnsCount As Long, _

ByVal TextColumns$, ByRef ErrorsArr) As Variant

' получает путь FolderPath$ к папке с DAT-файлами

' считывает из файлов все строки, в которых число записей в строке равно ColumnsCount

' остальные (неподходящие) строки отправляет в массив ErrorsArr

' (столбцы ErrorsArr: 1-имя файла, 2 - номер строки, 3 - данные)

' в переменной TextColumns$ через запятую перечислены номера ТЕКСТОВЫХ столбцов

' Возвращает двумерный массив размером N*ColumnsCount


ReDim ErrorsArr(1 To 1000, 1 To ColumnsCount + 2)

On Error Resume Next

 

Dim coll As New Collection, filename

filename = Dir(FolderPath$ & "*.dat")

While filename <> ""

coll.Add filename ' считываем в колекцию coll нужные имена файлов

filename = Dir

Wend

 

Dim newtxt As String, ro As String, errIndex As Long

For Each filename In coll

Application.StatusBar = "Обрабатывается файл: " & filename

newtxt = ReadTXTfile(FolderPath$ & filename)

tempArr = "": tempArr = Split(newtxt, vbNewLine)

For i = LBound(tempArr) To UBound(tempArr)

ro = tempArr(i): ro = Replace(ro, vbTab, ";")

If UBound(Split(ro, ";")) <> ColumnsCount - 1 And Len(Trim(ro)) > 0 Then

tempArr(i) = "": errIndex = errIndex + 1

ErrorsArr(errIndex, 1) = filename

ErrorsArr(errIndex, 2) = "Строка " & i + 1

ErrorsArr(errIndex, 3) = ro

End If

Next i

newtxt = Join(tempArr, vbNewLine)

txt = txt & newtxt & vbNewLine: DoEvents

Next

While InStr(1, txt, vbNewLine & vbNewLine) > 0

txt = Replace(txt, vbNewLine & vbNewLine, vbNewLine)

Wend

 

txt = Replace(txt, vbTab, ";"): tempArr = Split(txt, vbNewLine)

ReDim newArr(1 To UBound(tempArr), 1 To ColumnsCount)

 

For i = LBound(tempArr) To UBound(tempArr)

roArr = "": roArr = Split(tempArr(i), ";")

For j = 1 To ColumnsCount

newArr(i + 1, j) = roArr(j - 1)

If "," & TextColumns$ & "," Like "*," & j & ",*" Then

newArr(i + 1, j) = "'" & newArr(i + 1, j)

End If

Next j

Next i

DATfolder2Array = newArr

Application.StatusBar = False

End Function

Код вспомогательной функции Array2worksheet можно найти на странице http://excelvba.ru/code/Array2worksheet (Перенос двумерного массива на лист Excel)


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования