Страницы: 1
RSS
Импорт текста с разбором строки
 
Всем здравствуйте!  
 
Задача: Есть большая пачка файлов, в моем конкретном случае логи прокси-сервера (Squid). Все файлы имеют одинаковое количество колонок, но разной ширины. Разделители одинаковые (пробелы). Но в колонках могут попадаться и "ложные разделители". При импорте файлов необходимо разбирать строку на колонки и проверять её на соответствие заданным условиям. Если хотя бы одно условие не совпадает, пропускать строку.  
 
Кусок файла:  
1252904234.906    201 ***.***.***.*** TCP_MISS/200 1202 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
1252904300.335  19147 ***.***.***.*** TCP_MISS/200 5359 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
1252904373.322  66234 ***.***.***.*** TCP_MISS/200 5192 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
1252904373.864 136922 ***.***.***.*** TCP_MISS/200 80183 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
1252904373.867  92661 ***.***.***.*** TCP_MISS/200 12434 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
1252904373.870  92808 ***.***.***.*** TCP_MISS/200 15975 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
1252904373.872  92765 ***.***.***.*** TCP_MISS/200 14750 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
1252904373.874  94210 ***.***.***.*** TCP_MISS/200 81562 CONNECT ***.***.**:**** - DIRECT/***.***.*** -  
 
Собственно главное что меня интересует - это примеры импорта текстовых файлов средствами VBA, желательно с примером разбора строки.  
 
Заранее спасибо за помощь.
 
Примеров могу привести множество, но сомневаюсь, что их будет легко адаптировать к Вашим требованиям.  
 
Всё дело в необходимости "проверять её на соответствие заданным условиям".  
Не зная этих условий, сложно посоветовать что-то конкретное.  
 
Прикрепите к сообщению архив, в котором будут:  
1) текстовый файл (хватит 10-20 разных строк)  
2) Таблица Excel, которая должна получиться в результате.  
 
Чётко сформулируйте условия, на основании которых надо производить отбор строк.  
Укажите, где (в какой папке) макрос должен искать текстовые файлы.  
Формировать одну таблицу из всех текстовых файлов, или для каждого текстового файла - отдельную таблицу?  
 
PS: Макрос совсем не сложный (15-20 строк кода) - делал такие десятки раз.  
Вот только на выяснение нюансов тратится много времени...
 
{quote}{login=EducatedFool}{date=14.09.2009 02:40}{thema=}{post}Примеров могу привести множество, но сомневаюсь, что их будет легко адаптировать к Вашим требованиям.  
 
Всё дело в необходимости "проверять её на соответствие заданным условиям".  
Не зная этих условий, сложно посоветовать что-то конкретное.  
 
Прикрепите к сообщению архив, в котором будут:  
1) текстовый файл (хватит 10-20 разных строк)  
2) Таблица Excel, которая должна получиться в результате.  
 
Чётко сформулируйте условия, на основании которых надо производить отбор строк.  
Укажите, где (в какой папке) макрос должен искать текстовые файлы.  
Формировать одну таблицу из всех текстовых файлов, или для каждого текстового файла - отдельную таблицу?  
 
PS: Макрос совсем не сложный (15-20 строк кода) - делал такие десятки раз.  
Вот только на выяснение нюансов тратится много времени...{/post}{/quote}  
Условия проверки соответствия:  
- дата (в формате unix timestamp, первая (1) колонка)  
- вхождение строки (адрес сервера, седьмая (7) колонка)  
Формироваться будет одна книга из всех текстовых файлов. При превышении ограничения строк на листе создается новый лист. И на последнем листе будут подсчитываться средние значения по второй колонке. Исходные файлы будут лежать в "C:\TEMP\ACCESS\".  
Мне главное пример с разбором строки, а уж остальное, я думаю, допилю сам.
 
Вот пример макроса:  
 
Sub Main()  
   Dim SourceFolder As String, DestinationFolder As String, ce As Range  
   InitialPath = ThisWorkbook.Path: Dim coll As New Collection  
   Application.ScreenUpdating = False  
 
   '    SourceFolder = GetFolderPath("Выберите исходную папку для поиска файлов", InitialPath)  
   '    If SourceFolder = "" Then MsgBox "Необходимо указать папку!", vbCritical, "Папка не выбрана": Exit Sub  
   SourceFolder = "C:\TEMP\ACCESS\"  
 
   On Error Resume Next  
   '    If Dir(DestinationFolder, vbDirectory) = "" Then MkDir DestinationFolder    ' если конечная папка не существует, создаём её  
 
   Filename = Dir(SourceFolder & "*.txt")  
   While Filename <> ""  
       coll.Add Filename: Filename = Dir  
   Wend  
 
   Set fso = CreateObject("scripting.filesystemobject")  
 
   For Each Filename In coll  
       Debug.Print Filename  
       Application.StatusBar = "Обрабатывается файл  " & Filename    ' вывод информации в строку состояния  
 
       txt = "": Set ts = fso.OpenTextFile(SourceFolder & Filename, 1, True): txt = ts.ReadAll: ts.Close  
       arr = Split(txt, vbNewLine)    ' массив строк  
       For i = LBound(arr) To UBound(arr)  
           строка = Application.Trim(arr(i))  ' убираем повторяющиеся пробелы  
           массив = Split(строка, " ")   ' массив значений, разделённых пробелами  
 
           If массив(5) = "CONNECT" And Split(массив(6), ":")(1) = 443 Then    ' здесь пишем условия  
               ' в данном примере условия: CONNECT через 443 порт  
 
               ' запись в строку лита  
               Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(1, UBound(массив) + 1).Value = массив  
           End If  
       Next i  
   Next  
   Application.StatusBar = "": Application.ScreenUpdating = True  
End Sub  
 
Sub Очистка()  
   On Error Resume Next  
   ActiveSheet.UsedRange.Offset(1).ClearContents  
End Sub  
 
 
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", Optional ByVal InitialPath As String = "c:\") As String  
   GetFolderPath = "": PS = Application.PathSeparator  
   With Application.FileDialog(msoFileDialogFolderPicker)  
       .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath  
       If .Show = -1 Then GetFolderPath = .SelectedItems(1): If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS  
   End With  
End Function
 
Пример файла с макросом можно скачать здесь: http://excelvba.ru/XL_Files/Sample__14-09-2009__22-16-15.zip  
 
При желании его можно сколь угодно усложнить (или, наоборот, упростить - наверняка знатоки посоветовали бы использовать для открытия текстовых файлов метод OpenText)  
 
У меня есть также много готовых макросов для работы с сетью - например, можно макросом проверять доступность хостов (r примеру, при помощи пинга), скачивать файлы с интернета, разрешать доменные имена ( ya.ru -> 213.180.204.8 ), и т.д. и т.п. Но это уже не бесплатно (WebMoney).
 
Спасибо за пример! Будем допиливать под свои нужды. ))
 
ЭтаКнига:  
********************************    
Public oldValue As Variant  
Private Sub Workbook_Open()  
oldValue = False  
Call myMacro  
End Sub  
********************************  
Module1  
********************************  
Sub myMacro()  
Dim sh As Worksheet  
Dim strFileName As String  
Dim lngLen As Long  
Application.OnTime Now() + TimeSerial(0, 0, 20), "myMacro"  
Set sh = ActiveWorkbook.Sheets(1)  
strFileName = "C:\Temp\001.csv"  
lngLen = VBA.FileLen(strFileName)  
If sh.Cells(2, 1) > sh.Cells(12, 2) Then  
Debug.Print Time  
If (lngLen) > 0 Then  
Range("B1").Select  
Selection.QueryTable.Refresh BackgroundQuery:=False  
End If  
Application.OnTime Now + TimeValue("00:00:20"), "Update"  
End If  
End Sub  
*********************************  
Sub Update()  
Dim strFileName2 As String  
Dim lngLen2 As Long  
strFileName2 = "C:\Temp\001.csv"  
lngLen2 = VBA.FileLen(strFileName2)  
If (lngLen2) > 0 Then  
Range("B1").Select  
Selection.QueryTable.Refresh BackgroundQuery:=False  
Else  
MsgBox "Файл " & strFileName2 & " нулевой длины"  
End If  
End Sub  
********************************  
 
Скомпоновал из доступных заготовок макрос :), вроде работает. Но кажется громоздким.  
Задача такая - в Excel импортируются текстовые файлы с постоянным числом строк, текстовые файлы генерирует стороннее приложение методом полной перезаписи через равные промежутки времени. Поэтому если Excel попадёт на момент перезаписи файла - может вылететь по ошибке.  
Ячейка "B1" - начало диапазона импорта;  
Ячейка (2, 1) - приём даты/времени из приложения по DDE;  
Ячейка (12, 2) - дата/время последней строки импортируемого текстового файла.  
Как только значение в (2, 1) станет больше последнего времени обновления текстового файла, макрос через промежутки времени должен пытаться обновить диапазон задаваемое число раз, если не удалось - выдать сообщение.  
Диапазонов импорта и текстовых файлов будет несколько.  
Буду благодарен за умные советы. :)
Страницы: 1
Читают тему
Наверх
Loading...