Что нового

Имя обрабатываемого файла

maes_tro

Новичок
Сообщения
38
Репутация
0
Добрый день!

Как сделать, чтоб в 4 колонке отображалось имя файла (см вложение) из которого взяты данные для обработки? И возможно ли сделать так чтобы расчет не отображался, а только итоговый результат и при необходимости я мог его открыть(в смысле свернуть/развернуть ?
Код:
#include <array.au3>

Opt("TrayIconHide", 0)
Opt("TrayIconDebug", 1)

$zaglav = "Счетчик - калькулятор"

Global $Drawing = '***Чертеж простая***' ;Рисунок из 7 колонки по которому выполнять поиск

Global $n = 0
Global $iTotal1 = 0
Global $iTotal2 = 0
Global $iTotal3 = 0

Dim $aResult[0][4]

$filename = FileOpenDialog($zaglav, @ScriptDir, "TXT (*.txt)", 1 + 4)
If @error Then
    MsgBox(4096, "", "The End")
Else

    If StringInStr($filename, '|') Then;если выбрано несколько файлов
        $aListFile = StringSplit($filename, '|')
        $Folder = $aListFile[1]
        For $i = 2 To $aListFile[0]
            $sFullPath = $Folder & '\' & $aListFile[$i]
            _Count($sFullPath)
        Next
    Else ;если выбран один файл
        _Count($filename)
    EndIf
    ReDim $aResult[$n + 1][4] ; добавляем колонку
    $aResult[$n][0] = 'Итого'
    $aResult[$n][1] = $iTotal1
    $aResult[$n][2] = $iTotal2


   _ArrayDisplay($aResult)
EndIf

Func _Count($Path)

    $aFile = FileReadToArray($Path)
    For $i = 0 To UBound($aFile) - 1
        If StringStripWS($aFile[$i], 8) Then;Исключаем пустые строки
            $aLine = StringSplit($aFile[$i], ';')
            $n += 1
            ReDim $aResult[$n][4]
            $aResult[$n - 1][0] = $n

			$aResult[$n - 1][1] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5]

			If StringStripWS($aLine[7], 1 + 2) = $Drawing Then $aResult[$n - 1][2] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5];Выбор только по заданному рисунку

			$aResult[$n - 1][3] = "имя файла"

			$iTotal1 += $aResult[$n - 1][1]
            $iTotal2 += $aResult[$n - 1][2]
            $iTotal3 += $aResult[$n - 1][3]

		EndIf
    Next

EndFunc   ;==>_Count
 

Вложения

  • текстовый файл для обработки.txt
    492 байт · Просмотры: 1
  • имя текстового файла.JPG
    имя текстового файла.JPG
    72.9 КБ · Просмотры: 7

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Как сделать, чтоб в 4 колонке отображалось имя файла
Вот :
Код:
#include <array.au3>

Opt("TrayIconHide", 0)
Opt("TrayIconDebug", 1)

$zaglav = "Счетчик - калькулятор"

Global $Drawing = '***Чертеж простая***' ;Рисунок из 7 колонки по которому выполнять поиск

Global $n = 0
Global $iTotal1 = 0
Global $iTotal2 = 0
Global $iTotal3 = 0

Dim $aResult[0][4]

$filename = FileOpenDialog($zaglav, @ScriptDir, "TXT (*.txt)", 1 + 4)
If @error Then
	MsgBox(4096, "", "The End")
Else

	If StringInStr($filename, '|') Then;если выбрано несколько файлов
		$aListFile = StringSplit($filename, '|')
		$Folder = $aListFile[1]
		For $i = 2 To $aListFile[0]
			$sFullPath = $Folder & '\' & $aListFile[$i]
			_Count($sFullPath, $aListFile[$i])
		Next
	Else ;если выбран один файл
		$sShortFileName = StringRegExp($filename, "([^.\\]+)\.", 1);Имя файла из пути
		_Count($filename, $sShortFileName[0])
	EndIf
	ReDim $aResult[$n + 1][4] ; добавляем колонку
	$aResult[$n][0] = 'Итого'
	$aResult[$n][1] = $iTotal1
	$aResult[$n][2] = $iTotal2


	_ArrayDisplay($aResult)
EndIf

Func _Count($Path, $sFileName)

	$aFile = FileReadToArray($Path)
	For $i = 0 To UBound($aFile) - 1
		If StringStripWS($aFile[$i], 8) Then;Исключаем пустые строки
			$aLine = StringSplit($aFile[$i], ';')
			$n += 1
			ReDim $aResult[$n][4]
			$aResult[$n - 1][0] = $n

			$aResult[$n - 1][1] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5]

			If StringStripWS($aLine[7], 1 + 2) = $Drawing Then $aResult[$n - 1][2] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5];Выбор только по заданному рисунку

			$aResult[$n - 1][3] = $sFileName

			$iTotal1 += $aResult[$n - 1][1]
			$iTotal2 += $aResult[$n - 1][2]
			$iTotal3 += $aResult[$n - 1][3]

		EndIf
	Next

EndFunc   ;==>_Count
С какой целью Вы ввели переменную "$iTotal3", ведь в четвёртой колонке у Вас имена файлов, что Вы здесь считаете ?
Код:
$iTotal3 += $aResult[$n - 1][3]

И возможно ли сделать так чтобы расчет не отображался
Возможно, конечно !
при необходимости я мог его открыть
как Вы это видите ? Можно создавать не один, а два массива, и вызывать их по "Hot Key", а лучше, конечно если Вы опишите, что хотите получить на выходе в итоге - текстовый документ, документ Excel, нужен ли графический интерфейс для этого скрипта.
 
Автор
M

maes_tro

Новичок
Сообщения
38
Репутация
0
С какой целью Вы ввели переменную "$iTotal3", ведь в четвёртой колонке у Вас имена файлов, что Вы здесь считаете ?
Код:
$iTotal3 += $aResult[$n - 1][3]
Да это я так экперементирую)


при необходимости я мог его открыть
как Вы это видите ? Можно создавать не один, а два массива, и вызывать их по "Hot Key", а лучше, конечно если Вы опишите, что хотите получить на выходе в итоге - текстовый документ, документ Excel, нужен ли графический интерфейс для этого скрипта.
открыть (в смысле) свернуть/развернуть :smile:? на выходе конечно в идеале подойдет любой вариант, лишь бы я мог распечатать(только итоговые результаты).

И можно как то переименовать Col1 Col2 Col3
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
И можно как то переименовать Col1 Col2 Col3
Нет, а зачем, ведь это окно функции "_ArrayDisplay()" если есть необходимость назвать как-то колонки, то это нужно сделать, указав их название в "0" элементе массива. (через пару минут исправлю).
открыть (в смысле) свернуть/развернуть
Ведь скрипту как-то нужно знать Ваше желание получить короткий результат либо развёрнутый, подробный, для этого нужно иметь возможность как-то общаться со скриптом. Вариантов - масса, важно знать, как Вы это себе представляете. Вам нужен графический интерфейс, где будет, например "Radio button" для выбора развёрнутого/свернутого отчёта, окна "Listview" с результатами, кнопкой для сохранения результата в файл итд итп ?
Вот, с именами колонок:
Код:
#include <array.au3>

Opt("TrayIconHide", 0)
Opt("TrayIconDebug", 1)

$zaglav = "Счетчик - калькулятор"

Global $Drawing = '***Чертеж простая***' ;Рисунок из 7 колонки по которому выполнять поиск

Global $n = 1
Global $iTotal1 = 0
Global $iTotal2 = 0
Global $iTotal3 = 0

Dim $aResult[1][4]

$aResult[0][0]='№'
$aResult[0][1]='Название колонки 1'
$aResult[0][2]='Название колонки 2'
$aResult[0][3]='Имя файла'

$filename = FileOpenDialog($zaglav, @ScriptDir, "TXT (*.txt)", 1 + 4)
If @error Then
	MsgBox(4096, "", "The End")
Else

	If StringInStr($filename, '|') Then;если выбрано несколько файлов
		$aListFile = StringSplit($filename, '|')
		$Folder = $aListFile[1]
		For $i = 2 To $aListFile[0]
			$sFullPath = $Folder & '\' & $aListFile[$i]
			_Count($sFullPath, $aListFile[$i])
		Next
	Else ;если выбран один файл
		$sShortFileName = StringRegExp($filename, "([^.\\]+)\.", 1);Имя файла из пути
		_Count($filename, $sShortFileName[0])
	EndIf
	ReDim $aResult[$n + 1][4] ; добавляем колонку
	$aResult[$n][0] = 'Итого'
	$aResult[$n][1] = $iTotal1
	$aResult[$n][2] = $iTotal2


	_ArrayDisplay($aResult)
EndIf

Func _Count($Path, $sFileName)

	$aFile = FileReadToArray($Path)
	For $i = 0 To UBound($aFile) - 1
		If StringStripWS($aFile[$i], 8) Then;Исключаем пустые строки
			$aLine = StringSplit($aFile[$i], ';')
			$n += 1
			ReDim $aResult[$n][4]
			$aResult[$n - 1][0] = $n

			$aResult[$n - 1][1] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5]

			If StringStripWS($aLine[7], 1 + 2) = $Drawing Then $aResult[$n - 1][2] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5];Выбор только по заданному рисунку

			$aResult[$n - 1][3] = $sFileName

			$iTotal1 += $aResult[$n - 1][1]
			$iTotal2 += $aResult[$n - 1][2]
			$iTotal3 += $aResult[$n - 1][3]

		EndIf
	Next

EndFunc   ;==>_Count
 
Автор
M

maes_tro

Новичок
Сообщения
38
Репутация
0
Ведь скрипту как-то нужно знать Ваше желание получить короткий результат либо развёрнутый, подробный, для этого нужно иметь возможность как-то общаться со скриптом. Вариантов - масса, важно знать, как Вы это себе представляете. Вам нужен графический интерфейс, где будет, например "Radio button" для выбора развёрнутого/свернутого отчёта, окна "Listview" с результатами, кнопкой для сохранения результата в файл итд итп ?
Честно говоря вообще неважно как это будет работать. Меня графика не интересует совсем, нужны расчетные данные в компактном и удобном окне . "Radio button" очень даже неплохой вариант для решения вопроса :smile:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Ок, сейчас набросаю вариант с GUI.
Вот, тестируйте, не дописал только сохранение в файл, в Excel устроит ?
Код:
#include <GUIConstants.au3>
#include <array.au3>
#include <GuiListView.au3>
#include <excel.au3>

Global $zaglav = "Счетчик - калькулятор"
Global $n = 0
Global $iTotal1 = 0
Global $iTotal2 = 0
Dim $aResult[0][4]

$hMainGui = GUICreate($zaglav, 400, 370)
GUICtrlCreateGroup('', 5, 5, 260, 60)
$ShortRadio = GUICtrlCreateRadio('Свёрнутый', 15, 25)
GUICtrlSetState(-1, $GUI_CHECKED)
$LongRadio = GUICtrlCreateRadio('Развёрнутый', 150, 25)
GUICtrlCreateLabel('Название рисунка', 280, 20)
$DrawName = GUICtrlCreateInput('***Чертеж простая***', 280, 40, 110, 20)
$ListView = GUICtrlCreateListView('№|Название 1|Название 2|Имя файла', 5, 70, 390, 250)
_GUICtrlListView_SetColumnWidth(-1, 0, 70)
_GUICtrlListView_SetColumnWidth(-1, 1, 80)
_GUICtrlListView_SetColumnWidth(-1, 2, 80)
_GUICtrlListView_SetColumnWidth(-1, 3, 160)

$ButCreate = GUICtrlCreateButton('Выполнить', 5, 330, 120, 30)
$ButSave = GUICtrlCreateButton('Сохранить в файл', 135, 330, 120, 30)

GUISetState(@SW_SHOW, $hMainGui)

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButCreate
			_Create()
		Case $ShortRadio
			_FillTable(0)
		Case $LongRadio
			_FillTable(1)
		Case $ButSave
			_SaveFile()
	EndSwitch

WEnd

Func _SaveFile()
	$NewFileName = FileSaveDialog("Выберите имя", @ScriptDir, "Файл Excel (*.xlsx)", 2 + 16)
	If Not @error Then
		$oExcel = _Excel_Open(False)
		$oWorkbook = _Excel_BookNew($oExcel, 1)
		;Порлучаем текст наименований колонок в массив
		$ColCount = _GUICtrlListView_GetColumnCount($ListView)
		Dim $aHeader[1][$ColCount]
		For $i = 0 To _GUICtrlListView_GetColumnCount($ListView) - 1
			$aInfoCol = _GUICtrlListView_GetColumn($ListView, $i)
			$aHeader[0][$i] = $aInfoCol[5]
		Next
		;Запись названий колонок в Excel
		_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aHeader)
		;Запись короткого или полного отчёта в зависимости от состояния Radio
		If GUICtrlRead($ShortRadio) = $GUI_CHECKED Then ;Короткий
			_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, '1','A2')
			_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $iTotal1,'B2')
			_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $iTotal2,'C2')
			$iMaxItem=2;Номер максимальной строки в экселе (для рисования границ)
		Else ;Полный
			_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult,'A2')
			$iMaxItem=Ubound($aResult)+1;Номер максимальной строки в экселе (для рисования границ)
		EndIf
		_Excel_BookSaveAs($oWorkbook,$NewFileName,$xlWorkbookDefault,True)
		$oExcel.ActiveSheet.Range('A1:D'&$iMaxItem).Borders.LineStyle= 1;Границы
		$oExcel.Columns('A:D' ).EntireColumn.AutoFit ;Ширина колонок
		_Excel_Close($oExcel)
	EndIf
EndFunc   ;==>_SaveFile

Func _FillTable($Type)
	If $Type Then
		_GUICtrlListView_DeleteAllItems($ListView)
		_GUICtrlListView_AddArray($ListView, $aResult)

	Else
		_GUICtrlListView_DeleteAllItems($ListView)
		$Index = _GUICtrlListView_AddItem($ListView, '1')
		_GUICtrlListView_AddSubItem($ListView, $Index, $iTotal1, 1)
		_GUICtrlListView_AddSubItem($ListView, $Index, $iTotal2, 2)
	EndIf

EndFunc   ;==>_FillTable

Func _Create()
	$filename = FileOpenDialog($zaglav, @ScriptDir, "TXT (*.txt)", 1 + 4)
	If @error Then
		MsgBox(4096, "", "The End")
		Return
	EndIf

	If StringInStr($filename, '|') Then;если выбрано несколько файлов
		$aListFile = StringSplit($filename, '|')
		$Folder = $aListFile[1]
		For $i = 2 To $aListFile[0]
			$sFullPath = $Folder & '\' & $aListFile[$i]
			_Count($sFullPath, $aListFile[$i])
		Next
	Else ;если выбран один файл
		$sShortFileName = StringRegExp($filename, "([^.\\]+)\.", 1);Имя файла из пути
		_Count($filename, $sShortFileName[0])
	EndIf
	ReDim $aResult[$n + 1][4] ; добавляем колонку
	$aResult[$n][0] = 'Итого'
	$aResult[$n][1] = $iTotal1
	$aResult[$n][2] = $iTotal2

	If GUICtrlRead($ShortRadio) = $GUI_CHECKED Then
		_FillTable(0)
	Else
		_FillTable(1)
	EndIf
	;_ArrayDisplay($aResult)
EndFunc   ;==>_Create

Func _Count($Path, $sFileName)
	$Drawing = GUICtrlRead($DrawName)
	$aFile = FileReadToArray($Path)
	For $i = 0 To UBound($aFile) - 1
		If StringStripWS($aFile[$i], 8) Then;Исключаем пустые строки
			$aLine = StringSplit($aFile[$i], ';')
			$n += 1
			ReDim $aResult[$n][4]
			$aResult[$n - 1][0] = $n

			$aResult[$n - 1][1] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5]

			If StringStripWS($aLine[7], 1 + 2) = $Drawing Then $aResult[$n - 1][2] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5];Выбор только по заданному рисунку

			$aResult[$n - 1][3] = $sFileName

			$iTotal1 += $aResult[$n - 1][1]
			$iTotal2 += $aResult[$n - 1][2]

		EndIf
	Next

EndFunc   ;==>_Count
 
Автор
M

maes_tro

Новичок
Сообщения
38
Репутация
0
ra4o сказал(а):
Ок, сейчас набросаю вариант с GUI.
Вот, тестируйте, не дописал только сохранение в файл, в Excel устроит ?
Код:
#include <GUIConstants.au3>
#include <array.au3>
#include <GuiListView.au3>

Global $zaglav = "Счетчик - калькулятор"
Global $n = 0
Global $iTotal1 = 0
Global $iTotal2 = 0
Dim $aResult[0][4]

$hMainGui = GUICreate($zaglav, 400, 370)
GUICtrlCreateGroup('', 5, 5, 260, 60)
$ShortRadio = GUICtrlCreateRadio('Свёрнутый', 15, 25)
GUICtrlSetState(-1, $GUI_CHECKED)
$LongRadio = GUICtrlCreateRadio('Развёрнутый', 150, 25)
GUICtrlCreateLabel('Название рисунка', 280, 20)
$DrawName = GUICtrlCreateInput('***Чертеж простая***', 280, 40, 110, 20)
$ListView = GUICtrlCreateListView('№|Название 1|Название 2|Имя файла', 5, 70, 390, 250)
_GUICtrlListView_SetColumnWidth(-1, 0, 70)
_GUICtrlListView_SetColumnWidth(-1, 1, 80)
_GUICtrlListView_SetColumnWidth(-1, 2, 80)
_GUICtrlListView_SetColumnWidth(-1, 3, 160)

$ButCreate = GUICtrlCreateButton('Выполнить', 5, 330, 120, 30)
$ButSave = GUICtrlCreateButton('Сохранить в файл', 135, 330, 120, 30)

GUISetState(@SW_SHOW, $hMainGui)

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
        Case $ButCreate
			_Create()
		Case $ShortRadio
			_FillTable(0)
		Case $LongRadio
			_FillTable(1)
	EndSwitch

WEnd

Func _FillTable($Type)
If $Type Then
_GUICtrlListView_DeleteAllItems($ListView)
_GUICtrlListView_AddArray($ListView,$aResult)

Else
_GUICtrlListView_DeleteAllItems($ListView)
$Index=_GUICtrlListView_AddItem($ListView,'1')
_GUICtrlListView_AddSubItem($ListView,$Index,$iTotal1,1)
_GUICtrlListView_AddSubItem($ListView,$Index,$iTotal2,2)
EndIf

EndFunc

Func _Create()
	$filename = FileOpenDialog($zaglav, @ScriptDir, "TXT (*.txt)", 1 + 4)
If @error Then
	MsgBox(4096, "", "The End")
	Return
EndIf

	If StringInStr($filename, '|') Then;если выбрано несколько файлов
		$aListFile = StringSplit($filename, '|')
		$Folder = $aListFile[1]
		For $i = 2 To $aListFile[0]
			$sFullPath = $Folder & '\' & $aListFile[$i]
			_Count($sFullPath, $aListFile[$i])
		Next
	Else ;если выбран один файл
		$sShortFileName = StringRegExp($filename, "([^.\\]+)\.", 1);Имя файла из пути
		_Count($filename, $sShortFileName[0])
	EndIf
	ReDim $aResult[$n+1][4] ; добавляем колонку
	$aResult[$n][0] = 'Итого'
	$aResult[$n][1] = $iTotal1
	$aResult[$n][2] = $iTotal2

	If GuiCtrlRead($ShortRadio)=$GUI_CHECKED Then
		_FillTable(0)
	Else
		_FillTable(1)
	EndIf
	;_ArrayDisplay($aResult)
EndFunc

Func _Count($Path, $sFileName)
    $Drawing=GuiCtrlRead($DrawName)
	$aFile = FileReadToArray($Path)
	For $i = 0 To UBound($aFile) - 1
		If StringStripWS($aFile[$i], 8) Then;Исключаем пустые строки
			$aLine = StringSplit($aFile[$i], ';')
			$n += 1
			ReDim $aResult[$n][4]
			$aResult[$n - 1][0] = $n

			$aResult[$n - 1][1] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5]

			If StringStripWS($aLine[7], 1 + 2) = $Drawing Then $aResult[$n - 1][2] = (($aLine[3] / 1000) * ($aLine[4] / 1000)) * $aLine[5];Выбор только по заданному рисунку

			$aResult[$n - 1][3] = $sFileName

			$iTotal1 += $aResult[$n - 1][1]
			$iTotal2 += $aResult[$n - 1][2]

		EndIf
	Next

EndFunc   ;==>_Count
Да в Ехел будет норм!

Вообще нет слов! Склоняю перед вами голову! Спасибо. это просто шедевр для меня..
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Дописал сохранение в Excel , исправил скрипт в предыдущем ответе.
 
Верх