Что нового

[Данные, строки] Выборка нужных значений из текстовых файлов

Автор
A

arr1val

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

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
arr1val [?]
отрабатывается только один файл...где я не понимаю ?

Конеечно у тебя будет отрабатываться только последний файл
Надо сделать примерно так :
Код:
;НАЧАЛО
$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 -я кнопка слева)
 
Автор
A

arr1val

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

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
arr1val [?]
Тоже самое, только последний файл обрабатывается..
Не может быть
Поставь MsgBox и увидишь сколько файлов и какие

Код:
Func Parce($sFile)
	 MsgBox(0,'$sFile',$sFile,1)
	 ;....................
EndFunc
 
Автор
A

arr1val

Новичок
Сообщения
16
Репутация
0
gregaz
Месадж показывает все файлы, но пишется в отчет только последний, где ошибка ?
Код:
#include <file.au3>

;НАЧАЛО
$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)
;~  MsgBox(0,'$sFile',$sFile,1)
 $ADDR1=$file_path

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

 $ADDR2="D:\Наработки\Autoit\Works\Everest 2 OTRS\Export.csv" ; Адрес файла со сводным отчетом

 $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)
;~  FileWrite($FILE2,'"Maintenance";"Operational"'& @CRLF)
FileClose($FILE2)
endfunc
; КОНЕЦ
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Ну конечно ты открываешь файл для записи с флагом 2.
Это запись с предварительной очисткой файла
Надо :
Код:
$FILE2=FileOpen($ADDR2,1)

с записью в конец фала
 
Автор
A

arr1val

Новичок
Сообщения
16
Репутация
0
gregaz
:beer:
Дурень я, учиться и учиться.

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

gregaz
snoitaleR

БОльшущее ВАМ Спасибо!
 

gregaz

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



Добавлено:
Сообщение автоматически объединено:

Еще пара замечаний ао поводу последнего приведенного тобой варианта

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



Добавлено:
Сообщение автоматически объединено:

Еще надо вывести из ф-ии создание массива :
Код:
Dim $A[9][2].............
 
Автор
A

arr1val

Новичок
Сообщения
16
Репутация
0
gregaz
Очередное спасибо, "оптимизировал".
 
Верх