Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Обработка файла с помощью AutoIT

Ответить
Настройки темы
Обработка файла с помощью AutoIT

Новый участник


Сообщения: 49
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток уважаемые!!!

не подскажете как удобнее всего реализовать следующее:
есть файл csv в котором есть данные разделенные запятыми. Так вот мне необходимо суммировать некоторые данные по строкам.
приведу пример исходного файла:

07.06.2011 8:01 62.80.230.41 ХХХ.ХХХ.ХХХ.ХХХ TCP 3389 1875 0,022325 10
07.06.2011 8:01 81.23.3.110 ХХХ.ХХХ.ХХХ.ХХХ TCP 3389 1987 0,022293 10

так вот хотелось бы в итоге получить итоговый файл в котором отображалось бы сумма столбца 8 соответствующая 3 столбцу
т.е. простыми словами суммировать по строкам. Трудность в том что в файле около 230 000 строк - и использовать эксель с макросами немного затруднительно.

Отправлено: 11:06, 28-06-2011

 

Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Space-06,
Т.е. сумма (0,022325 и т.п.) должна быть подсчитана отдельно для всех вхождений 62.80.230.41, потом для всех 81.23.3.110, ..., и.т.д. Я правильно понял?

Отправлено: 11:30, 28-06-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Space-06, быстрее всего (для счёта, не для времени разработки, понятно) будет использование подобной технологии: vbscript: работа с большими текстовыми файлами.

P.S. Вопрос, собственно, упирается в следующее: допустимо ли использование статистических функций в текстовом провайдере OLEDB?! Я сие не выяснял.

Последний раз редактировалось Iska, 28-06-2011 в 12:20.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:15, 28-06-2011 | #3


Новый участник


Сообщения: 49
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата madmasles:
Т.е. сумма (0,022325 и т.п.) должна быть подсчитана отдельно для всех вхождений 62.80.230.41, потом для всех 81.23.3.110, ..., и.т.д. Я правильно понял? »
да это именно так.


Цитата Iska:
быстрее всего (для счёта, не для времени разработки, понятно) будет использование подобной технологии: vbscript: работа с большими текстовыми файлами. »
вопрос как сформировать запрос - чтоб результат потом выводился в др файл.

Отправлено: 19:14, 28-06-2011 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Space-06, тогда хотелось бы увидеть реальный пример:
Цитата Space-06:
файл csv »
поскольку приведённый Вами выше пример — как бы не CSV.

Предположим, что файл — CSV (хорошо бы ещё, для чистоты, иметь текстовые поля заключёнными в кавычки, а так придётся, как минимум, сделать десятичным разделителем точку), например, такого вида:
Source.txt
Код: Выделить весь код
07.06.2011 8:01, 62.80.230.41, еее.еее.еее.еее, TCP, 3389, 1875, 0.022325, 10
07.06.2011 8:03, 62.80.230.41, еее.еее.еее.еее, TCP, 3389, 1875, 0.05, 10
07.06.2011 8:01, 81.23.3.110, еее.еее.еее.еее, TCP, 3389, 1987, 0.022293, 10
08.06.2011 9:02, 81.23.3.110, еее.еее.еее.еее, TCP, 3389, 1987, 0.06, 10
Тогда, файл Schema.ini может выглядеть примерно так:
читать дальше »
Код: Выделить весь код
[Source.txt]
ColNameHeader=False
Format=Delimited(,)
TextDelimiter=none
CharacterSet=ANSI
Col1=DateTime Date
Col2=IPAddress char
Col3=Name char
Col4=Protocol char
Col5=Port Integer
Col6=SomeField1 Integer
Col7=Cost Float
Col8=SomeField2 Integer


А само приложение — наподобие:
читать дальше »
Код: Выделить весь код
AutoItSetOption("MustDeclareVars", 1)

Local Const $adOpenStatic     = 3
Local Const $adLockOptimistic = 3
Local Const $adCmdText        = 1


Local $oRecordSet = ObjCreate("ADODB.Recordset")


$oRecordSet.Open("SELECT " & _
	"FIRST([DateTime]) AS [FDateTime], " & _
	"LAST([DateTime]) AS [LDateTime], " & _
	"[IPAddress], " & _
	"COUNT(*) AS [Count], " & _
	"FIRST([Name]) AS [FName], " & _
	"SUM([Cost]) AS [TotalCost] " & _
	"FROM [" & "Source.txt" & "] " & _
	"GROUP BY [IPAddress] ", _
	"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "E:\Песочница\0058" & ";Extended Properties=""text;""", _
	$adOpenStatic, $adLockOptimistic, $adCmdText)

With $oRecordSet.Fields
	ConsoleWrite(.Item("FDateTime").Name & @TAB)
	ConsoleWrite(.Item("LDateTime").Name & @TAB)
	ConsoleWrite(.Item("IPAddress").Name & @TAB)
	ConsoleWrite(.Item("Count").Name & @TAB)
	ConsoleWrite(.Item("FName").Name & @TAB)
	ConsoleWrite(.Item("TotalCost").Name & @CRLF)
EndWith

ConsoleWrite("------------------------------------------------------------------------------------" & @CRLF)

While Not $oRecordSet.EOF()
	With $oRecordSet.Fields
		ConsoleWrite(.Item("FDateTime").Value & @TAB)
		ConsoleWrite(.Item("LDateTime").Value & @TAB)
		ConsoleWrite(.Item("IPAddress").Value & @TAB)
		ConsoleWrite(.Item("Count").Value & @TAB)
		ConsoleWrite(.Item("FName").Value & @TAB)
		ConsoleWrite(.Item("TotalCost").Value & @CRLF)
	EndWith

	$oRecordSet.MoveNext
WEnd

ConsoleWrite("------------------------------------------------------------------------------------" & @CRLF)

$oRecordSet.Close
$oRecordSet = 0

Exit(0)

где:
Код: Выделить весь код
E:\Песочница\0058
— путь к текстовому файлу «Source.txt» и лежащему рядом с ним «Schema.ini».

Результат работы скрипта:
читать дальше »

Код: Выделить весь код
FDateTime	LDateTime	IPAddress	Count	FName	TotalCost
------------------------------------------------------------------------------------
20110607080100	20110607080300	62.80.230.41	2	ХХХ.ХХХ.ХХХ.ХХХ	0.072325
20110607080100	20110608090200	81.23.3.110	2	ХХХ.ХХХ.ХХХ.ХХХ	0.082293
------------------------------------------------------------------------------------


Цитата Space-06:
…чтоб результат потом выводился в др файл.
Приведите для этого пример результирующего файла.

Отправлено: 02:35, 29-06-2011 | #5


Аватара для AZJIO

Старожил


Сообщения: 254
Благодарности: 126

Профиль | Отправить PM | Цитировать


Space-06, изучай
Код: Выделить весь код
; #include <Array.au3> ; для _ArrayDisplay

$text = FileRead(@ScriptDir&'\список.txt')
If StringInStr($text, @LF) Then
    $aText=StringSplit(StringStripCR(StringStripWS($text, 7)), @LF) ; делим данные построчно в массив, удалив симовол @CR и повтор пробела
Else
    $aText=StringSplit(StringStripWS($text, 7), @CR)
EndIf

Global $aTable[$aText[0]+1][9] ; создаём новый массив с 9-ю колонками
$aTable[0][0]=$aText[0]

; заполняем массив 9-ти колоночный, раздробив строку на колонки по пробелам
For $i = 1 to $aText[0]
    $aTmp=StringSplit($aText[$i], ' ')
    For $j = 1 to $aTmp[0]
        $aTable[$i][$j-1]=$aTmp[$j]
    Next
Next

$aOut=_Calculate($aTable) ; функция подсчёта
; _ArrayDisplay($aOut, 'aOut')
$Out=''
For $i = 1 to $aOut[0][0] ; объединение массива в многострочный текст
    $aOut[$i][0]&=@TAB&$aOut[$i][1]
    $Out&=$aOut[$i][0]&@CRLF
Next

$file = FileOpen(@ScriptDir&'\новый список.txt',2) ; записываем в файл
FileWrite($file, $Out)
FileClose($file)

Func _Calculate($a)
    Local $k, $ind, $i
    If Not IsArray($a) Or UBound($a)<2 Then SetError(1, 0, 'проблема массива') ; проверка валидности массива

    $ind='_//' ; индекс для непересечения с переменными функции
    Assign($ind, 2, 1)

    $k=0
    For $i = 1 To $a[0][0]
        If Not IsDeclared($a[$i][2]&$ind) Then
            $k+=1
            $a[$k][0]=$a[$i][2]
        EndIf
        Assign($a[$i][2]&$ind, Eval($a[$i][2]&$ind)+StringReplace($a[$i][7], ',', '.'), 1) ; создаём локальные переменные или увеличиваем значение для уже созданных
    Next
    
    If $k = 0 Then Return SetError(1, 0, 'проблема массива')
    ReDim $a[$k+1][2]
    For $i = 1 to $k
        $a[$i][1]=Eval($a[$i][0]&$ind)
    Next
    $a[0][0]=$k
    Return $a
EndFunc

Последний раз редактировалось AZJIO, 29-06-2011 в 05:07.


Отправлено: 04:40, 29-06-2011 | #6


Новый участник


Сообщения: 49
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, а схема какая должна быть для csv?

Код: Выделить весь код
[Source.csv]
ColNameHeader=False
Format=CSVDelimited
TextDelimiter=none
CharacterSet=ANSI
Col1=DateTime Date
Col2=IPAddress char
Col3=Name char
Col4=Protocol char
Col5=Port Integer
Col6=SomeField1 Integer
Col7=Cost Float
Col8=SomeField2 Integer
а результат должен быть:

IPAddress и TotalCost

Отправлено: 07:41, 30-06-2011 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Space-06:
Iska, а схема какая должна быть для csv? »
Всё зависит от формата конкретного Вашего файла. Ориентируйтесь в поиске на примерно такой запрос: "Schema.ini".
Цитата Space-06:
а результат должен быть:
IPAddress и TotalCost »
Значит, в:
Код: Выделить весь код
$oRecordSet.Open("SELECT " & _
	"FIRST([DateTime]) AS [FDateTime], " & _
	"LAST([DateTime]) AS [LDateTime], " & _
	"[IPAddress], " & _
	"COUNT(*) AS [Count], " & _
	"FIRST([Name]) AS [FName], " & _
	"SUM([Cost]) AS [TotalCost] " & _
	"FROM [" & "Source.txt" & "] " & _
	"GROUP BY [IPAddress] ", _
	"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "E:\Песочница\0058" & ";Extended Properties=""text;""", _
	$adOpenStatic, $adLockOptimistic, $adCmdText)
(ну, и далее — в выводе) можно оставить только эти поля. Я привёл остальное скорее как образец того, каких результатов можно добиться применением технологий баз данных даже относительно обычных текстовых файлов.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:45, 30-06-2011 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Обработка файла с помощью AutoIT

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Запись дисков с помощью AutoIt TERMINAL AutoIt 2 29-10-2010 05:44
Обработка изображений с помощью GIMP для чайника safetyinfo Цифровое изображение 1 28-05-2010 23:00
Возможна ли линковка 2-х программ с помощью autoit?? Uxtbl AutoIt 11 29-07-2009 15:51
[решено] Aвторизация на сайте с помощью AutoIt Yandex AutoIt 6 14-04-2009 20:08
Обработка лог-файла на C++ Guest Программирование и базы данных 17 23-03-2004 01:11




 
Переход