Страницы: 1
RSS
Импортирование из txt блоками
 
Стоит задача - импортировать в excel данные из текста. Но структура текста такова, что данные идут не построчно, а блоками, вот грубый пример (реально все сложнее)  
 
=======================  
1.2.2000        Пушкин    
счет 32452345   кредит 245245  
описание1  
 
=======================  
3.4.2004        Лермонтов    
счет 32452345   кредит 243246  
описание221  
 
=======================  
3.5.2004        Тютчев    
счет 32452345   кредит 2452455  
описание3331  
 
по идее для такой задачи есть платные надстройки типа import wizard:  
http://www.sharewareconnection.com/import-wizard.htm  
http://www.beside.com/products.html  
 
Можно ли эту задачу реализовать как-то без буржуйских платных надстроек ?
 
> Можно ли эту задачу реализовать как-то без буржуйских платных надстроек ?  
 
Конечно.  
Самый обычный макрос для Excel сформирует вам из этого текстового файла табличку из нескольких столбцов.  
 
Вопросы:  
1) надо обрабатывать один файл txt, или несколько?  
Если несколько, то где макрос должен искать папку с файлами txt?  
 
2) где пример файла TXT? (обязательно нужен кусок реального файла - хватит и 10-100 блоков)  
где пример таблицы Excel, которую надо получить?  
 
3) каков максимальный объём файла TXT - сколько бывает блоков? (в среднем, и по максимуму)
 
Замечу по теме - есть вариант переложить скриптом из одного текста в другой с разделителями vbTab и с расширением xls. Такой текст откроется корректно в Экселе для ручной дальнейшей обработки. Я часто этот приём использую для быстрой выборки из текстовых отчётов именно нужной информации.  
Например, кусок кода (писал вроде для этого форума для Бухгалтер777) :  
 
'# пишем новый сводный текстовый файл с нетекстовым расширением :)  
Set objFile = objFSO.OpenTextFile("C:\temp\Бухгалтер777\svod.xls", ForAppending)  
'сперва заголовок  
objFile.WriteLine "Номер старый" & vbTab & "Дата" & vbTab & "Номер новый"  
'а затем и данные из заполненной части массива  
For x = 0 To y  
objFile.WriteLine arr2(x, 0) & vbTab & arr2(x, 1) & vbTab & arr2(x, 2)  
Next  
objFile.Close
 
Вот та тема:  
http://www.planetaexcel.ru/forum.php?thread_id=19344  
Там есть пример скрипта, его можно и под эту задачу переделать.
 
Вот какие данные у меня  
Как вытащить ?  
 
(группировка блоков в одном текстовом файле может быть по датам или по клиентам, а предполагаеммый результат - в excel файле)
 
В приведенном примере http://www.planetaexcel.ru/forum.php?thread_id=19344 уж больно все заточено под конкретный случай, переделать не так просто
 
> группировка блоков в одном текстовом файле может быть по датам или по клиентам  
 
это несколько усложняет макрос - придётся, по сути, писать 2 макроса.  
Могу сделать, но не бесплатно. (работы много)  
Если готовы заплатить - обращайтесь, контакты в подписи.
 
Пример можно переделать - алгоритм похожий.  
Но тут есть другой ход - попробуйте переименовать эти тексты в xls :)  
Хотя строгой системы нет, но что-то сделать уже можно.
 
Попробуйте  
copy /b *.txt all.xls  
открываете полученный файл, ставите автофильтр по фамилиям.  
Кое-где косяки есть, но в общем можно вручную подправить.  
Может больше ничего городить и не надо?
 
Хотя поторопился - список по агентам так не взять, там надо чуть кодом пройтись...
 
{quote}{login=Hugo}{date=04.11.2010 11:36}{thema=}{post}Пример можно переделать - алгоритм похожий.{/post}{/quote}  
Вряд ли под эти текстовые файлы можно переделать другое решение...  
 
Слишком много "мусора" - лишних символов, да и 2 разных типа файлов надо обрабатывать.  
Тут надо писать макрос "с нуля"  
 
А переименование файлов в XLS ничего не решит - хоть файлы и будут открываться в Excel, ситуацию это не улучшит - ибо результат будет весьма далек от желаемой таблицы.
 
Ну уж не так сильно далёк.  
Два типа кода - это да.  
Для агентов надо кодом добавить столбец, куда расплодить фамилии, для дат аналогично даты.  
Потом выбрать автофильтром, подправить мусор вручную.  
Такой вот полуавтомат.  
Или надо всё 100% кодом сделать?
 
Я планирую такой путь:  
1. собираем все файлы агентов в один txt-xls, файлы дат в другой.  
2. в файле-обработчике пишем два простых похожих кода по добавлению колонки с фамилиями/датами. По нажатию кнопки обрабатываем один из типов файлов.  
3. в файле-обработчике пишем код по подчистке мусора - удаление ненужных строк, сдвиге косяков на место. Исполняем после п.2.  
4. сохраняем результат как законный xls кодом или вручную.  
5. по желанию можно слить файлы вместе на текстовом этапе (после п.3) или как слияние xls.
 
Вот кусочек п.2. :  
после добавления в файл "Список по датам.txt.xls" колонки "C" для дат  
 
Option Explicit  
 
Sub ChngDates()  
Dim cc As Range, dt As Date  
 
For Each cc In Intersect(ActiveSheet.Columns(1), ActiveSheet.UsedRange)  
If IsDate(cc.Value) Then  
dt = cc.Value  
Else  
cc.Offset(, 2) = dt  
End If  
 
Next  
End Sub  
 
Теперь можно циклом по "A" удалить строки с датой, с "всего" и с пусто.
 
Дальше: после добавления в файл "Список по агентам.txt.xls" колонки "A" для фамилий  
 
Sub ChngNames()  
Dim cc As Range, nm As String  
 
For Each cc In Intersect(ActiveSheet.Columns(2), ActiveSheet.UsedRange)  
If nm = "" Then  
If cc.Value <> "" Then nm = cc.Value  
Else  
If UCase(Trim(cc.Value)) = "ВСЕГО" Then nm = ""  
cc.Offset(, -1) = nm  
End If  
Next  
End Sub  
 
Теперь можно циклом по "A" удалить строки с пусто.
 
В агентах сперва косяк убрать надо - пройтись циклом (снизу вверх) по столбцу L и всё встреченное перенести на строку выше, а эту строку удалить.
Страницы: 1
Читают тему
Наверх
Loading...