Что нового

[Автоматизация] Перебор строк в списке файлов

VladVN

Новичок
Сообщения
2
Репутация
0
Здравствуйте. У меня есть список путей к файлам в формате txt.Вида:
C:\1.txt
C:2.txt
Нужно выполнить построчный перебор каждого файла в списке (файлы тоже txt), но, с условиями. Что нужно сделать:
1. Найти поле "From"
2. Начать построчную запись в ячейку excel
3. Найти поле "To:"
4. Продолжить построчную вставку в следующую ячейку таблицы.
5. След условие и тд.
6. Достигнув конца файла, начать следующий по порядку.
Вот мои наработки.
Скрипт работает по другому принципу, хотел сначала все загнать в txt файл с разделителями, потом импортом утащить в Excel, не дошел даже до этого.

$sLines = _FileCountLines($file_spisok) ; число сток в файле-задании
$search_from = "From:"
$search_to = "To:"
$search_Date = "Date:"
$search_subject = "Subject:"
$search_attach = "Attachments:"
$search_end = '---------------------------------------'
$search_end2 = "---------------------------------------------------------------------------"
For $i = 1 To $sLines
$perebor = FileReadLine($file_spisok, $i) ;построчно считываем файл-задание, $perebor = полный путь к файлу логов
$failz = FileRead($perebor) ;открываем текущий файл из списка файла-задания, ;failz = полностью считанный файл логов
$aLines = StringSplit($failz, @CRLF, 1) ;массив, содержащий разбитые строки файла логов
for $i=1 To $aLines[0] ;построчное считывание лога, $i- считываемая строка
Global $FROM = StringInStr($aLines[$i],$search_from) ; содержат позиции найденных строк
Global $TO = StringInStr($aLines[$i], $search_to)
Global $DATE = StringInStr($aLines[$i], $search_Date)
Global $SUBJECT = StringInStr($aLines[$i], $search_subject)
Global $ATTACH = StringInStr($aLines[$i], $search_attach)
Global $END = StringInStr($aLines[$i], $search_end2)
;MsgBox(4096,"Значение переменных", "FROM =" & $FROM_S & @CRLF & "TO_S=" & $TO_S) ; отладка
Next
for $i=1 To $aLines[0]
While $i < $TO
FileWriteLine($file_output, $aLines[$i])
$i = $i + 1
WEnd
FileWrite($file_output, "/////////TOO////////////////////" & @LF)
While $i<$DATE
FileWriteLine($file_output, $aLines[$i])
$i = $i + 1
WEnd
FileWrite($file_output, "/////////DATEE////////////////////" & @LF)
While $i<$SUBJECT
FileWriteLine($file_output, $aLines[$i])
$i = $i + 1
WEnd
FileWrite($file_output, "//////////SUBJJ///////////////////" & @LF)
While $i<$ATTACH
FileWriteLine($file_output, $aLines[$i])
$i = $i + 1
WEnd
FileWrite($file_output, "/////////ATTAA////////////////////" & @LF)
While $i<$END
FileWriteLine($file_output, $aLines[$i])
$i = $i + 1
WEnd
FileWrite($file_output, "///////////ENDD//////////////////" & @LF)
if $i = $aLines[0] Then
ExitLoop
EndIf
Next
Next

Пример текста для распарсивания:

From: "Иван Иваныч" <Ivan @mail.ru>
To: chelovek @mail.ru
Date: 18.03.2016 9:13:10
Subject: Привет
Attachments: Котики.zip (6 842)
------------------------------------------------
Привет, прислал котов.
Все они устроены одинаково, но основная проблема в том, что в некоторый файлах есть несколько адресов и тогда скрипт не работает. Например:
From: "Иван Иваныч" <Ivan @mail.ru>
To: chelovek @mail.ru
Chel1 @ya.ru
Eche @rambler.
Date: 18.03.2016 9:13:10
Subject: Привет
Attachments: Котики.zip (6 842)
------------------------------------------------
Привет, прислал котов.

Надеюсь на помощь, образование экономическое, в программировании не шарю.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Полученный файл output.txt можно скопипастить в Excel с разделителем точка с запятой.

Код:
#include <File.au3>
Global $filelist[0]
_FileReadToArray(@ScriptDir & "\files.txt", $filelist)
For $i=1 To $filelist[0]
	Local $currentfile[0]
	_FileReadToArray($filelist[$i], $currentfile)
	$str_exp=""
	For $x=1 To $currentfile[0]
		Select
			Case StringInStr($currentfile[$x], "From: ")
				$str_exp=$str_exp & StringReplace($currentfile[$x], "From: ", "") & ";"
			Case StringInStr($currentfile[$x], "     To: ")
				$str_exp=$str_exp & StringReplace($currentfile[$x], "     To: ", "") & ";"
			Case StringInStr($currentfile[$x], "   Date: ")
				$str_exp=$str_exp & StringReplace($currentfile[$x], "   Date: ", "") & ";"
			Case StringInStr($currentfile[$x], "Subject: ")
				$str_exp=$str_exp & StringReplace($currentfile[$x], "Subject: ", "")
		EndSelect
	Next
	FileWriteLine(@ScriptDir & "\output.txt", $str_exp)
Next


UPD: чтобы не составлять список файлов руками:
Код:
_FileListToArray
 
Автор
V

VladVN

Новичок
Сообщения
2
Репутация
0
Благодарю,все работает, единственное, если адресов получателей несколько, берет только первый. Можете подсказать, что тут можно придумать?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <Excel.au3>

_Example()

Func _Example()
	Local $aFileList = FileReadToArray("FileList.txt"), $iUBound = @extended
	If @error Then Exit _Error("Не удалось получить список файлов")

	Local $aOut[$iUBound][6], $sData, $aRegExp, $aSplit, $iStrip = $STR_STRIPLEADING + $STR_STRIPTRAILING
	Local $oExcel = _Excel_Open(False)
	If @error Then _Error("_Excel_Open: " & @error)
	Local $oWorkbook = _Excel_BookNew($oExcel)
	If @error Then _Error("_Excel_BookNew: " & @error)

	For $i = 0 To $iUBound - 1
		$sData = FileRead($aFileList[$i])

		$aRegExp = StringRegExp($sData, "From:(.*)", 1)
		If Not @error Then $aOut[$i][0] = StringStripWS($aRegExp[0], $iStrip)
		$aRegExp = StringRegExp($sData, "Date:(.*)", 1)
		If Not @error Then $aOut[$i][2] = StringStripWS($aRegExp[0], $iStrip)
		$aRegExp = StringRegExp($sData, "Subject:(.*)", 1)
		If Not @error Then $aOut[$i][3] = StringStripWS($aRegExp[0], $iStrip)
		$aRegExp = StringRegExp($sData, "Attachments:(.*)", 1)
		If Not @error Then $aOut[$i][4] = StringStripWS($aRegExp[0], $iStrip)
		$aRegExp = StringRegExp($sData, "------------------------------------------------\R((?s).*)", 1)
		If Not @error Then $aOut[$i][5] = StringStripWS($aRegExp[0], $iStrip)

		$aRegExp = StringRegExp($sData, "To:((?s).*?)\R.*?Date:", 1)
		If Not @error Then
			$aSplit = StringSplit(StringStripWS(StringStripCR($aRegExp[0]), $iStrip), @LF)
			For $j = 1 To $aSplit[0]
				$aOut[$i][1] &= StringStripWS($aSplit[$j], $iStrip) & @CRLF
			Next
			$aOut[$i][1] = StringTrimRight($aOut[$i][1], 2)
		EndIf
	Next

	_Excel_RangeWrite($oWorkbook, Default, $aOut)
	With $oWorkbook.ActiveSheet
		.Rows.AutoFit
		.Columns.AutoFit
	EndWith
	_Excel_BookSaveAs($oWorkbook, @ScriptDir & "\Out.xls", $xlExcel8, True)
	_Excel_Close($oExcel)
EndFunc   ;==>_Example

Func _Error($sText)
	Exit MsgBox($MB_ICONERROR + $MB_TOPMOST, "Ошибка", $sText)
EndFunc   ;==>_Error
 
Верх