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

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

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
arr1val  [?]
Цитировать
можно ли в конце получаемой строчки (каждой в последующем) в файле-результате дописывать два статичных параметра Maintenance и Operational
Нет ничего проще :
Код: AutoIt [Выделить]
#include <Array.au3>
$sText=ClipGet()
$sPattern='(?:513|514|518|517|520|538|534|528|524).+,(.*?)\r\n'
$aRez=StringRegExp ( $sText, $sPattern,3)
_ArrayDisplay($aRez)
$sStr=_ArrayToString($aRez,'";"')
$sStr &='";"Maintenance";"Operational"'
MsgBox(0,'$sStr',$sStr)
 

Самая большая проблема – её сформулировать. 

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


Оффлайн arr1val [?]

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

  • Автор темы
  • Репутация: 0
    • Награды
gregaz  [?]
Цитировать
Если номер железки в отчете присутствует ,а данных нет ,то последний Паттерн выдаст пустую строку в массиве
В моем случае больше подходит вариант snoitaleR с возможностью точно указать максимальное количество устройств одного типа, т.к. в итоге важна одинаковость каждой строки = одинаковое количество полей.

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Кстати если нужно обрезать кое - какие концовки данных,
то это выполняется тоже просто добавлением в Паттерн в конце еще одной скобки с перечислением вырезаемых фрагментов


Добавлено: Июль 01, 2010, 11:56:56
arr1val  [?]
Цитировать
с возможностью точно указать максимальное количество устройств одного типа
А зачем указывать ?
Сколько есть устройств одного типа - все выведутся в массив



Добавлено: Июль 01, 2010, 12:00:27
arr1val  [?]
Цитировать
важна одинаковость каждой строки = одинаковое количество полей.
У меня одинаковость зависит только от одинаковости формы отчета (если в отчетах порядок перечисления устройств одинаков - то строки будут одинаковыми
« Последнее редактирование: Июль 01, 2010, 12:03:28 от gregaz, Причина: Объединение сообщений »

Оффлайн arr1val [?]

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

  • Автор темы
  • Репутация: 0
    • Награды
gregaz  [?]
Цитировать
Кстати если нужно обрезать кое - какие концовки данных,то это выполняется тоже просто добавлением в Паттерн в конце еще одной скобки с перечислением вырезаемых фрагментов
Как указать на фрагменты если они могут от железяки к железяке меняться? Да и устраивает подробная информация :)


Цитировать
А зачем указывать ?Сколько есть устройств одного типа - все выведутся в массив
В том то и дело - такой подход не катит для дальнейшей обработки полученного отчета, который будет загружаться в програмку. А сама эта програмка воспринимает загрузку по строгому шаблону, т.е. если ей указано, что в 7-ом по счету поле инфа по видео карте - там должна быть инфа по видеокарте, если попадется комп к которому на момент сканирования еверестом было подключено 4 винта - все 4 попадут в отчет - поля сдвинутся, в поле где должна была быть инфа по видюхе (по номеру в смысле) попадет инфа про проц и будет у меня в програмке в поле Видеокарта: "Интел коре 2 дуо" :)

А сейчас все по красоте :

Оказался второй винт - прописали, не оказалось второго сетевого адаптера - пустота. Был третий винт еще подключен..не повезло ему попасть в отчет :)




Добавлено: Июль 01, 2010, 13:54:21
На основе примера snoitaleR родил что-то такое, отрабатывается только один файл...где я не понимаю ? :)

; НАЧАЛО
$everest="D:\Everest" ;откуда забираем отчеты евереста
$f_search=FileFindFirstFile($everest & '\*')
If $f_search = -1 Then Exit

While 1
    $file=FileFindNextFile($f_search)
        If @error = 1 Then ExitLoop
$file_path=$everest & "\" & $file
Wend


 $ADDR1=$file_path

(нажмите для показа/скрытия)
« Последнее редактирование: Июль 01, 2010, 13:54:21 от arr1val, Причина: Объединение сообщений »

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


Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
arr1val  [?]
Цитировать
В том то и дело - такой подход не катит для дальнейшей обработки полученного отчета, который будет загружаться в програмку.
А стоит ли для тривиальной задачи использовать несколько программ ?
Вот все в одной :
Код: AutoIt [Выделить]
$sText= FileRead('Отчет1.txt')
Dim $aNumber[10]=[9,514,518,513,517,520,528,534,538,523]
Dim $aParametrName[10]=[9,"Name : ","Model : ","Operaiting Sistem : ","CPU : ","RAM : ","Hard Dick : ","Network Adapter : ","IP Address : ","Grafic Adapter : "]
$sInfo1="Deployment State : Maintenance"
$sInfo2="Incident State : Operational"
$sStr=''
For $i=1 To UBound($aNumber)-1
    If  $i=2 Then $sStr &=$sInfo1 & @CRLF & $sInfo2 & @CRLF
    $aParametr=StringRegExp ( $sText, $aNumber[$i] & ",.+,(.*)",3)
    If IsArray($aParametr) Then
        $sDelta = $aParametr[0]
    Else   
        $sDelta =@CRLF; Если параметр отсутствует
    EndIf  
    $sStr &=$aParametrName[$i] & $sDelta
    If $i=6 Or $i=7 Then
        If UBound($aParametr)=2 Then
            $sStr &=$aParametrName[$i] & $aParametr[1]
        Else
            $sStr &=$aParametrName[$i] & @CRLF; Если 2-ой экземпляр отсутствует
        EndIf
    EndIf
Next
MsgBox(0, "$sStr", $sStr)
 

Здесь даже учитывается возможность отсутствия в каком то из отчетов какого либо параметра.
Хотя это маловероятно для евереста , тогда можно упростить.
Здесь осталось ввести форматирование

Оффлайн arr1val [?]

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

  • Автор темы
  • Репутация: 0
    • Награды
gregaz
Задача вцелом не совсем тривиальна, ежедневно по каждой машине (400-500 штук) собирается еверестовские отчеты. Есть некая система - помесь диспетчеризации и сервисдеска, в которую надо загрузить "основные средства" с характеристиками (проц, мать и т.д.). Делать это вручную - ужастно и долго, а при условии что точность данных надо будет еженедельно сверять, т.к. постоянно идут какие-то апгрейды\замены и т.д. - так вобще невозможно.
Вот я и обратился к вам, т.к. с помощью скрипта задача автоматизируется на 90%. Еверест сам по себе собирает, скрипт по шедулеру подготавливает требуемый для софтины отчет, софтина импортирует себе.

Оффлайн gregaz [?]

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

Конеечно у тебя будет отрабатываться только последний файл
Надо сделать примерно так :
Код: AutoIt [Выделить]
;НАЧАЛО
$everest="D:\Everest" ;откуда забираем отчеты евереста
$f_search=FileFindFirstFile($everest & '\*')
If $f_search = -1 Then Exit

While 1
    $file=FileFindNextFile($f_search)
    If @error = 1 Then ExitLoop
    $file_path=$everest & "\" & $file
    Parce($file_path);Переход на ф-ию Parce
Wend
Func Parce($sFile)
     ;....................
EndFunc  
 

Кстати надо скрипт оформлять в теги AutoIT(3 -я кнопка слева)

Оффлайн arr1val [?]

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

  • Автор темы
  • Репутация: 0
    • Награды
gregaz
Тоже самое, только последний файл обрабатывается..
С тегами учту - новичек :)

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


Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
arr1val  [?]
Цитировать
Тоже самое, только последний файл обрабатывается..
Не может быть
Поставь  MsgBox и увидишь сколько файлов и какие

Код: AutoIt [Выделить]
Func Parce($sFile)
     MsgBox(0,'$sFile',$sFile,1)
     ;....................
EndFunc  
 


Оффлайн arr1val [?]

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

  • Автор темы
  • Репутация: 0
    • Награды
gregaz
Месадж показывает все файлы, но пишется в отчет только последний, где ошибка ?
(нажмите для показа/скрытия)

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Ну конечно ты открываешь файл для записи с флагом 2.
Это запись с предварительной очисткой файла
Надо :
Код: AutoIt [Выделить]
$FILE2=FileOpen($ADDR2,1)
 

с записью в конец фала

Оффлайн arr1val [?]

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

  • Автор темы
  • Репутация: 0
    • Награды
gregaz
 :beer:
Дурень я, учиться и учиться.

Возможно ли сделать, чтоб он при каждой отработке очищал все-таки файл, но записывал всю информацию ? :)

gregaz
snoitaleR

БОльшущее ВАМ Спасибо!
« Последнее редактирование: Июль 01, 2010, 17:06:36 от arr1val »

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
arr1val  [?]
Цитировать
Возможно ли сделать, чтоб он при каждой отработке очищал все-таки файл, но записывал всю информацию ?
Не очень понял что-то взаимоисключающее.
Ты имеешь ввиду очищать перед каждым новым сеансом?
Тогда надо 1 раз открыть файл с флагом 2 (очистить)
Запись производить только 1 раз за сеанс,но суммарного текста.
Т.е. Получить текст всех строк сеанса и записать 1 раз весь текст



Добавлено: Июль 01, 2010, 17:05:01
Еще пара замечаний ао поводу последнего приведенного тобой варианта

1Надо вывести из функции в голову скрипта  строки открытия файла-записи.
   Зачем сто раз открывать его?
2. То же для : FileClose($FILE2)
3.В функции должен обрабатываться файл,указанный в пвраметрах ф-ии
Код: AutoIt [Выделить]
Func Parce($sFile)
;~  MsgBox(0,'$sFile',$sFile,1)
; $ADDR1=$file_path
$ADDR1=$sFile
;..........



Добавлено: Июль 01, 2010, 17:07:42
Еще надо вывести из ф-ии создание массива :
Код: AutoIt [Выделить]
Dim $A[9][2].............
 

« Последнее редактирование: Июль 01, 2010, 17:07:42 от gregaz, Причина: Объединение сообщений »

Оффлайн arr1val [?]

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

  • Автор темы
  • Репутация: 0
    • Награды
gregaz
Очередное спасибо, "оптимизировал".

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


 

Похожие темы

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