Автор Тема: [Данные, строки] Выборка нужных значений из текстовых файлов  (Прочитано 12044 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн arr1val [?]

  • Новичок
  • *
  • Сообщений: 16
  • Репутация: 0
    • Награды
Приветствую.
Требуется отпарсить несколько сотен текстовых файлов(отчеты евереста) из которых вытащить требуемую информацию. К примеру, нужна информация о процессоре, в каждом файле синтаксис строк с параметрами одинаков, только железяки разные, к примеру:
Суммарная информация,,Системная плата,517,Тип ЦП,DualCore Intel Pentium;необходим только текст после Тип ЦП, и до ; , т.е. DualCore Intel Pentium
пример 2
Суммарная информация,,Отображение,523,Видеоадаптер,NVIDIA GeForce 8400 GS  (512 Мб)необходимо только NVIDIA GeForce 8400 GS

И сложить полученную информацию в текстовый файл формата:
"Материнка";"DualCore Intel Pentium";"NVIDIA GeForce 8400 GS";"Винт";"и т.д."где каждый обработанный файл это одна строка, т.е. обработано 200 файлов получился txt на 200 строк.
Может есть у кого похожий пример ? Или подскажите алгоритм.

Русское сообщество AutoIt


Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
arr1val
Если можно, выложи один отчет сюда в тему...
Для примера...
И еще несколько вопросов:
1. Количество "железок" в отчетах одинаково?
2. Названия каких "железок" нужно вытащить из отчетов?
Главное в жизни человека - это отношение...

Оффлайн arr1val [?]

  • Новичок
  • *
  • Сообщений: 16

  • Автор темы
  • Репутация: 0
    • Награды
Файл отчета
(нажмите для показа/скрытия)

1. Может меняться. К номеру строки не привяжешься.
2. Суммарная информация,,Компьютер,514,Имя компьютера,
    Суммарная информация,,Компьютер,513,Операционная система,
    Суммарная информация,,Системная плата,517,Тип ЦП,
    Суммарная информация,,Системная плата,518,Системная плата,
    Суммарная информация,,Системная плата,520,Системная память,
    Суммарная информация,,Отображение,523,
    Суммарная информация,,Хранение данных,528,
(их может быть несколько в спойлере видно)
    Суммарная информация,,Сеть,538,Первичный адрес IP,
    Суммарная информация,,Сеть,534,Сетевой адаптер,
(тоже может быть несколько)

На основе примера - должна получится такая штука:
"COMPUTERNAME";"Служебное поле";"Служебное поле";"Gigabyte GA-G33M-S2";"Служебное поле";"Служебное поле";"Windows XP Professional";"DualCore Intel Pentium 1800 MHz";"2048";"Hitachi 7200 RPM SATA-II";"160";"Realtek RTL8168/8111";"Служебное поле";"192.168.20.198";"NVIDIA GeForce 8400 GS 512"Где служебное поле это информация статическая не требующая изменений. Порядок не важен.

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
arr1val
Думаю, не финальная версия, а первый набросок, идея, так сказать...

Код: AutoIt [Выделить]
; НАЧАЛО

 $ADDR1="1.TXT" ; Адрес файла с отчетом EVEREST

 $FILE1=FileOpen($ADDR1,0)
 $TEXT1=FileRead($FILE1)
 FileClose($FILE1)

 $ADDR2="2.TXT" ; Адрес файла со сводным отчетом

 $FILE2=FileOpen($ADDR2,2)

 Dim $A[9]=["514","513","517","518","520","523","528","538","534"]
 
 $TEXT2=""

 For $iA=0 To UBound($A)-1

  $BEGIN=1

  While True

   $B=StringInStr($TEXT1,","&$A[$iA]&",",0,1,$BEGIN)
   If $B=0 Then ExitLoop
   $B=StringInStr($TEXT1,",",0,3,$B)+1
   $E=StringInStr($TEXT1,@CR,0,1,$B)
   $S=StringMid($TEXT1,$B,$E-$B)
   $TEXT2=$TEXT2&'"'&$S&'";'
   $BEGIN=$E

  WEnd

 Next

 FileWrite($FILE2,$TEXT2)
 FileClose($FILE2)

; КОНЕЦ
 


Русское сообщество AutoIt


Оффлайн arr1val [?]

  • Новичок
  • *
  • Сообщений: 16

  • Автор темы
  • Репутация: 0
    • Награды
snoitaleR
Спасибо! В домашних условиях проверил - сам принцип работает. Попробую завтра прикрутить перебор по файлам и проверить "съедает" ли прога отчет, а пока появилась еще пара вопросов :) ПО куда будет загружаться полученный отчет восприимчиво к "полям" (наименования между точками с запятой), т.е. я сначала завожу макет импорта в программу, где указываю что первое поле это имя компа, второе ОС и т.д., вопрос: Можно ли сделать, чтобы в случае отсутствия второй сетевой или второго винта оставлялось просто пустое поле - ;""; , ну а соответственно там где есть эти поля заполнялись ?

Правильно понимаю, что данные достаются по логике "после цифры с запятой и еще одной запятой начинай брать инфу" ?

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
arr1val
Для незаполненных полей пока не могу представить алгоритм...
К примеру, жесткие диски...
Сколько пустых полей оставлять? По количеству букв в латинском алфавите?
То есть, не ясно максимальное число тех или иных одинаковых "железок"...

Оффлайн arr1val [?]

  • Новичок
  • *
  • Сообщений: 16

  • Автор темы
  • Репутация: 0
    • Награды
snoitaleR
Два. Два под адаптеры сетевые, два под винты - больше быть не может.

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Еще набросок получения массива данных :
Код: AutoIt [Выделить]
#include <Array.au3>
$sText=ClipGet()
$sPattern='(?:Имя компьютера|Компьютер.*Операционная система|Системная плата.*Системная плата|Тип ЦП|Системная память|Первичный адрес IP|Сетевой адаптер|Дисковый накопитель|3D-акселератор),(.+)'
$aRez=StringRegExp ( $sText, $sPattern,3)
_ArrayDisplay($aRez)


Строку из массива уже можно получить любым способом (например :  _ArrayToString  и т.д.) ,дополнив служебными полями ,кавычками и т.п.
Самая большая проблема – её сформулировать. 

Русское сообщество AutoIt


Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
gregaz
В конце каждого элемента массива пустой квадратик...
Вероятно, @CR...
Можно его исключить?

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
snoitaleR  [?]
Цитировать
Можно его исключить?
Чем ты его видишь ? я Не вижу.
Во всяком случае можно в конце пaттерна добавить : \r\n или только \r или  \n
Код: AutoIt [Выделить]
$sPattern='(?:Имя компьютера|Компьютер.*Операционная система|Системная плата.*Системная плата|Тип ЦП|Системная память|Первичный адрес IP|Сетевой адаптер|Дисковый накопитель|3D-акселератор),(.+)\r\n'
 



Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
gregaz
После изменения патерна все Ok...


Добавлено: Июнь 30, 2010, 22:52:31
arr1val
Модернизировал свой вариант...
Теперь можно указывать максимальное количество тех или иных одинаковых "железок"...
Если их оказывается меньше, то оставляются пустые строки "";

Код: AutoIt [Выделить]
; НАЧАЛО

 $ADDR1="1.TXT" ; Адрес файла с отчетом EVEREST

 $FILE1=FileOpen($ADDR1,0)
 $TEXT1=FileRead($FILE1)
 FileClose($FILE1)

 $ADDR2="2.TXT" ; Адрес файла со сводным отчетом

 $FILE2=FileOpen($ADDR2,2)

 Dim $A[9][2]=[["514","1"],["513","1"],["517","1"],["518","1"],["520","1"],["523","1"],["528","2"],["538","1"],["534","2"]]
 
 $TEXT2=""

 For $iA=0 To UBound($A)-1

  $BEGIN=1

  For $jA=1 To $A[$iA][1]

   $B=StringInStr($TEXT1,","&$A[$iA][0]&",",0,1,$BEGIN)
   If $B=0 Then
    $TEXT2=$TEXT2&'"";'
    ContinueLoop
   EndIf
   $B=StringInStr($TEXT1,",",0,3,$B)+1
   $E=StringInStr($TEXT1,@CR,0,1,$B)
   $S=StringMid($TEXT1,$B,$E-$B)
   $TEXT2=$TEXT2&'"'&$S&'";'
   $BEGIN=$E

  Next

 Next

 FileWrite($FILE2,$TEXT2)
 FileClose($FILE2)

; КОНЕЦ
 


Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
snoitaleR , Твой вариант натолкнул меня на упрощение.
Наверное так будет выглядеть попроще  :
Код: AutoIt [Выделить]
$sPattern='(?:514|513|518|517|520|538|534|528|524).+,(.+)\r\n'
 

« Последнее редактирование: Июнь 30, 2010, 23:17:37 от gregaz »

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
gregaz
Да... Так компактнее... С учетом специфики отчета...
Я сейчас пытаюсь понять, как можно продолжить решение с помощью регулярных выражений, если нужно оставлять пустые строки для отсутствующих "железок"...

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
snoitaleR  [?]
Цитировать
Я сейчас пытаюсь понять, как можно продолжить решение с помощью регулярных выражений, если нужно оставлять пустые строки для отсутствующих "железок"...

Если номер железки в отчете присутствует ,а данных нет ,то последний Паттерн выдаст пустую строку в массиве



Добавлено: Июнь 30, 2010, 23:51:22
Виноват Чуть изменить его надо :
Код: AutoIt [Выделить]
$sPattern='(?:514|513|518|517|520|538|534|528|524).+,(.*?)\r\n'
 

Поставить . *? вместо .+ (необязательность присутствия)
« Последнее редактирование: Июнь 30, 2010, 23:53:53 от gregaz »

Оффлайн arr1val [?]

  • Новичок
  • *
  • Сообщений: 16

  • Автор темы
  • Репутация: 0
    • Награды
gregaz
snoitaleR

Проверил все предложенные варианты, все работает! СпасибО! :IL_AutoIt_1:
Забыл сразу спросить\сказать, можно ли в конце получаемой строчки (каждой в последующем) в файле-результате дописывать два статичных параметра Maintenance и Operational, чтоб выглядело вот так:
"COMPUTERNAME";"Microsoft Windows 2000 Professional";"DualCore Intel Pentium; 1800 MHz";"Intel Eva Cove DG35EC  (1 PCI; 2 PCI-E x1; 1 PCI-E x16; 4 DDR2 DIMM; Audio; Video; Gigabit LAN; IEEE-1394)";"1013 MB";"Intel(R)  G35 Express Chipset Family  (384 MB)";"HDS728080PLA380  (80 GB; 7200 RPM; SATA-II)";"PHILIPS [email protected] FLASH DISK USB Device";"192.168.17.43";"Intel(R) 82566DC Gigabit Network Connection  (192.168.17.43)";"";"Maintenance";"Operational"
А сам пока попробую цикл прикрутить :)

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
16 Ответов
15010 Просмотров
Последний ответ Март 23, 2014, 22:10:29
от spy686
14 Ответов
5809 Просмотров
Последний ответ Ноябрь 14, 2011, 14:47:44
от Math
0 Ответов
1385 Просмотров
Последний ответ Июль 28, 2012, 00:13:50
от madmasles
4 Ответов
5554 Просмотров
Последний ответ Ноябрь 12, 2012, 16:18:33
от Cfar
5 Ответов
5457 Просмотров
Последний ответ Февраль 07, 2013, 08:51:06
от exHalfer
5 Ответов
2657 Просмотров
Последний ответ Май 31, 2013, 18:23:19
от InnI
11 Ответов
5499 Просмотров
Последний ответ Апрель 29, 2015, 22:38:30
от Tapok
10 Ответов
3502 Просмотров
Последний ответ Февраль 28, 2016, 14:27:19
от krekerok
1 Ответов
420 Просмотров
Последний ответ Февраль 09, 2018, 11:33:23
от gunter123
1 Ответов
389 Просмотров
Последний ответ Июль 11, 2018, 18:20:59
от InnI