Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2011, 12:49   #1
Неологист
Новичок
Джуниор
 
Регистрация: 27.09.2011
Сообщений: 4
По умолчанию импорт данных из большого txt файла

День добрый!

Требуется написать скрипт, который бы вытаскивал из txt файла соответствие 2 чисел. В одну ячейку число, которое стоит после TS11&TELEPHON-, а в другую - число после BSNBC=TELEPHON-

В файле попадаются строки, в которых нет этого сочетания значений (есть только BSNBC=TELEPHON-). Они не нужны.

Фрагмент txt:
PHP код:
<CRMSUB:MSIN=112233445566,BSNBC=TELEPHON-9998887766-TS11&TELEPHON-5554710050-TS11&TS21&TS22&GPRS,NDC=904,MSCAT=ORDINSUB,SUBRES=ALLPLMN-ROAM,ACCSUB=BSS,PRFMSIN=GPRS-999999999999,NUMTYP=MULTI;
<
ENTROPRSERV:MSIN=112233445566,OPRSERV=OCSI-OCSI1-ACT-DACT&TCSI-TCSI1-ACT-DACT;
<
ENTRCFSERV:MSIN=112233445566,CFSERV=CFBUSY,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445566,CFSERV=CFNREPLY,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445566,BSFTNO=TELEPHON,RCTIM=30;
<
ENTRCFSERV:MSIN=112233445566,CFSERV=CFNREACH,NCS=NO;
<
ENTRGCSERV:MSIN=112233445566,GCSERV=CALLWAIT-ACT-TELEPHON&CALLHOLD&CLIP&NATSS05,CLIPOVR=NO;
<
CRMSUB:MSIN=112233445577,BSNBC=TELEPHON-9998887765-TS11&TELEPHON-5554710823-TS11&TS21&TS22&GPRS,NDC=908,MSCAT=ORDINSUB,SUBRES=ALLPLMN-ROAM,ACCSUB=BSS,PRFMSIN=GPRS-999999999999,NUMTYP=MULTI;
<
ENTROPRSERV:MSIN=112233445577,OPRSERV=OCSI-OCSI1-ACT-DACT&TCSI-TCSI1-ACT-DACT;
<
ENTRCFSERV:MSIN=112233445577,CFSERV=CFBUSY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=ACT,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445577,CFSERV=CFNREPLY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=ACT,RCTIM=30,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445577,CFSERV=CFNREACH,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=ACT,NCS=NO;
<
ENTRCFSERV:MSIN=112233445577,CFSERV=CFU,NCS=NO;
<
ENTRGCSERV:MSIN=112233445577,GCSERV=CALLWAIT-PROV&CALLHOLD&CLIP&MPTY,CLIPOVR=YES;
<
CRMSUB:MSIN=112233445588,BSNBC=TELEPHON-9998887764-TS11&TS21&TS22&GPRS,NDC=904,MSCAT=ORDINSUB,SUBRES=ALLPLMN-ROAM,ACCSUB=BSS,PRFMSIN=GPRS-999999999999,NUMTYP=MULTI;
<
ENTROPRSERV:MSIN=112233445588,OPRSERV=OCSI-OCSI1-ACT-DACT&TCSI-TCSI1-ACT-DACT;
<
ENTRCFSERV:MSIN=112233445588,CFSERV=CFBUSY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=REG,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445588,CFSERV=CFNREPLY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=REG,RCTIM=15,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445588,CFSERV=CFNREACH,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=REG,NCS=NO;
<
ENTRGCSERV:MSIN=112233445588,GCSERV=CALLWAIT-PROV&CALLHOLD&CLIP,CLIPOVR=NO;
<
CRMSUB:MSIN=112233445599,BSNBC=TELEPHON-9998887763-TS11&TS21&TS22&GPRS,NDC=904,MSCAT=ORDINSUB,SUBRES=ALLPLMN-ROAM,ACCSUB=BSS,PRFMSIN=GPRS-999999999999,NUMTYP=MULTI;
<
ENTROPRSERV:MSIN=112233445599,OPRSERV=OCSI-OCSI1-ACT-DACT&TCSI-TCSI1-ACT-DACT;
<
ENTRCFSERV:MSIN=112233445599,CFSERV=CFBUSY,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445599,CFSERV=CFNREPLY,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445599,BSFTNO=TELEPHON,RCTIM=15;
<
ENTRCFSERV:MSIN=112233445599,CFSERV=CFNREACH,NCS=NO;
<
ENTRGCSERV:MSIN=112233445599,GCSERV=CALLWAIT-ACT-TELEPHON&CALLHOLD&CLIP,CLIPOVR=NO;
<
CRMSUB:MSIN=112233445500,BSNBC=TELEPHON-9998887762-TS11&TS21&TS22&GPRS,NDC=904,MSCAT=ORDINSUB,SUBRES=ALLPLMN-ROAM,ACCSUB=BSS,PRFMSIN=GPRS-999999999999,NUMTYP=MULTI;
<
ENTROPRSERV:MSIN=112233445500,OPRSERV=OCSI-OCSI1-ACT-DACT&TCSI-TCSI1-ACT-DACT;
<
ENTRCFSERV:MSIN=112233445500,CFSERV=CFBUSY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=ACT,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445500,CFSERV=CFNREPLY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=ACT,RCTIM=30,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445500,CFSERV=CFNREACH,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=ACT,NCS=NO;
<
ENTRGCSERV:MSIN=112233445500,GCSERV=CALLWAIT-ACT-TELEPHON&CALLHOLD&CLIP,CLIPOVR=NO;
<
CRMSUB:MSIN=112233445600,BSNBC=TELEPHON-9998887761-TS11&TS21&TS22&GPRS,NDC=904,MSCAT=ORDINSUB,SUBRES=ALLPLMN-ROAM,ACCSUB=BSS,PRFMSIN=GPRS-999999999999,NUMTYP=MULTI;
<
ENTROPRSERV:MSIN=112233445600,OPRSERV=OCSI-OCSI1-ACT-DACT&TCSI-TCSI1-ACT-DACT;
<
ENTRCFSERV:MSIN=112233445600,CFSERV=CFBUSY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=REG,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445600,CFSERV=CFNREPLY,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=REG,RCTIM=15,NCS=NO,NFS=NO;
<
ENTRCFSERV:MSIN=112233445600,CFSERV=CFNREACH,BSFTNO=TELEPHON-79524500600-INTNO,STATUS=REG,NCS=NO;
<
ENTRGCSERV:MSIN=112233445600,GCSERV=CALLWAIT-PROV&CALLHOLD&CLIP,CLIPOVR=NO
Из этого надо вытянуть:

9998887766 5554710050
9998887765 5554710823

Прошу помощи, знаний в VB 0 =\

Последний раз редактировалось Неологист; 28.09.2011 в 12:58.
Неологист вне форума Ответить с цитированием
Старый 28.09.2011, 13:40   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Сделать не сложно. Задача простая и неинтересная.
И - или писать много, или (если писать мало) - можно вывих мозга получить
Поэтому все молчат...

Поищите у EducatedFool на сайте функции по работе с текстовыми файлами - открыть файл, читать построчно, анализировать строку на наличие подстрок (по Instr() или Like), выбрать нужные подстроки (по Instr() или Split()).
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.09.2011, 13:53   #3
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Насколько большой?
От этого зависит способ считывания
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.09.2011, 13:54   #4
Неологист
Новичок
Джуниор
 
Регистрация: 27.09.2011
Сообщений: 4
По умолчанию

около 350Мб
Неологист вне форума Ответить с цитированием
Старый 28.09.2011, 13:58   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я сразу сказал - построчно.
Было недавно - в массив/память (ReadAll) не влезало...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.09.2011, 14:05   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Кстати, можно попробовать вручную -
1.текст в Эксель (может 2007 прожуёт?)
2.разбить по столбцам по запятым.
3.отсортировать по B

Увидите все нужные строки рядом, нужные ячейки можно вручную выбрать на другой лист, снова разбить, ну или прямо на месте...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.09.2011, 14:20   #7
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Так я считывал по 400 метров:
Код:
Sub QWERTy()
Dim R, C
Dim NUM
Dim BLOK()
ReDim BLOK(1 To 2, 0)
Dim n1, n2
Dim k1, k2
FL = "C:\TT.txt"
R = 1
NUM = 1
    Dim Fsys As Object
    Set Fsys = CreateObject("Scripting.FileSystemObject")
    Dim Tstream As Object
    Set Tstream = Fsys.OpenTextFile(FL)
    Dim z As String
    While Not Tstream.AtEndOfStream
      z = Tstream.ReadLine
'      Debug.Print z
      If InStr(1, z, "TS11&TELEPHON") > 0 And InStr(1, z, "BSNBC=TELEPHON-") > 0 Then
      n1 = InStr(1, z, "TS11&TELEPHON") + 14
      n2 = InStr(1, z, "BSNBC=TELEPHON-") + 15
      k1 = InStr(n1, z, "-")
      k2 = InStr(n2, z, "-")
      ReDim Preserve BLOK(1 To 2, UBound(BLOK, 2) + 1)
       BLOK(2, UBound(BLOK, 2) - 1) = Mid(z, n1, k1 - n1)
        BLOK(1, UBound(BLOK, 2) - 1) = Mid(z, n2, k2 - n2)
        Debug.Print BLOK(1, UBound(BLOK, 2) - 1), BLOK(2, UBound(BLOK, 2) - 1)
      End If
    Wend
Cells.ClearContents
       Range(Cells(1, 1), Cells(UBound(BLOK, 2), 2)).Value = Application.Transpose(BLOK)
End Sub
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.09.2011, 14:24   #8
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Debug-и лучше сразу закоментить - быстрей будет
Ну и если результат влезет на лист
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.09.2011, 15:12   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

alex77755? , быстрее будет, если избавиться от And и ReDim Preserve.
От And - сделать вложенный If Then, а вот от Preserve... может сперва один раз прочитать файл и посчитать строки, сделать массив, а потом читать ещё раз уже отбирая данные?
И кстати Application.Transpose тоже на больших количествах сбоит - лучше сразу делать двумерный массив и выгружать Resize'ом.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.09.2011, 15:41   #10
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Цитата:
может сперва один раз прочитать файл и посчитать строки, сделать массив
Я не могу пока об этом судить - только учусь.
Но считать надо же строки, удовлетворяющие условию!? всё равно проверять надо!?
По свободе проверю.
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт в эксел очень большого файла txt danika24 Microsoft Office Excel 10 20.07.2011 16:34
импорт данных из excel в txt и из txt в excel ESV Microsoft Office Excel 3 19.11.2010 10:29
Импорт данных из текстового файла chobo Microsoft Office Excel 7 28.10.2010 14:29
импорт из txt, работа с массивом данных, экспорт в txt Danara Microsoft Office Excel 4 31.03.2010 00:26
Импорт в базу данных из файла. Stalkr БД в Delphi 7 12.11.2008 15:26