Что нового

Как Форматировать текст

StarEdik

Новичок
Сообщения
365
Репутация
4
Версия AutoIt: 3.3.6.1

Описание:
Привет всем.
Есть Efemer1.тхт файл
Скрипт (написанный madmaslesом)загружает текст из файла Efemer1.txt в ListView построчно.
Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>

$sFile = @ScriptDir & '\Efemer1.txt'
If Not FileExists($sFile) Then
    MsgBox(16, 'Error', 'No ' & $sFile)
    Exit
EndIf
$sText = FileRead($sFile)
$aText = StringSplit(StringStripCR($sText), @LF)

Dim $aTextItem[$aText[0]][1]
For $i = 1 To $aText[0]
    $aTextItem[$i - 1][0] = $aText[$i]
Next
$sText = ''
$aText = 0

GUICreate('Test', 500, 500)                 ;L    T   W   H
$nButtonDel = GUICtrlCreateButton('Delete', 400, 20, 80, 30)
$nButtonSave = GUICtrlCreateButton('Save', 400, 60, 80, 30)
$nButtonOpenFile = GUICtrlCreateButton('Open File', 400, 100, 80, 30)
$nButtonAvtoFormat = GUICtrlCreateButton('Avto Format', 400, 140, 80, 30)
$nListView = GUICtrlCreateListView('', 2, 2, 380, 490, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Test', 150)
_GUICtrlListView_AddArray($hListView, $aTextItem)
$aTextItem = 0
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButtonDel
            GUICtrlSetState($nButtonDel, $GUI_DISABLE)
            GUICtrlSetState($nButtonSave, $GUI_DISABLE)
            $aDel = _GUICtrlListView_GetSelectedIndices($hListView, True)
            If $aDel[0] Then
                For $i = 1 To $aDel[0]
                    _GUICtrlListView_DeleteItem($hListView, $aDel[$i])
                Next
            EndIf
            $aDel = 0
            _GUICtrlListView_SetItemSelected($hListView, -1, False)
            GUICtrlSetState($nButtonDel, $GUI_ENABLE)
            GUICtrlSetState($nButtonSave, $GUI_ENABLE)
        Case $nButtonSave
            GUICtrlSetState($nButtonDel, $GUI_DISABLE)
            GUICtrlSetState($nButtonSave, $GUI_DISABLE)
            $iCount = _GUICtrlListView_GetItemCount($hListView)
            For $i = 0 To $iCount - 1
                $sText &= _GUICtrlListView_GetItemText($hListView, $i) & @CRLF
            Next
            $hFile = FileOpen($sFile, 2)
            FileWrite($hFile, StringTrimRight($sText, 2))
            FileClose($hFile)
            $sText = ''
            $iCount = 0
            $hFile = 0
            GUICtrlSetState($nButtonDel, $GUI_ENABLE)
            GUICtrlSetState($nButtonSave, $GUI_ENABLE)
    EndSwitch
WEnd
Этот файл в таком формате.
Код:
Поиск события
 
Интервал поиска: 01.06.2011  0:00:00 - 31.12.2012  0:00:00
Шаг поиска: 0ч 10м
Критерий поиска:
mon.0,90,180.jup,ven
 
Интервалы реализации (начало - конец):
6.06.2011 19:10 (GMT+3) -7.06.2011 18:50 (GMT+3)
13.06.2011  9:40 (GMT+3) -14.06.2011 12:00 (GMT+)
20.06.2011 12:10 (GMT+3) -21.06.2011 14:50 (GMT+3)
28.06.2011  8:10 (GMT+3) -29.06.2011 14:20 (GMT+3)
5.07.2011 12:20 (GMT+3) -6.07.2011 11:20 (GMT+3)
12.07.2011  3:20 (GMT+3) -13.07.2011  6:40 (GMT+3)
19.07.2011 12:10 (GMT+3) -20.07.2011 15:20 (GMT+3)
27.07.2011  7:20 (GMT+3) -28.07.2011 12:20 (GMT+3)
Надо чтоб было возможность выбора файла ( кнопка Open File ) для открытия и после нажатия на кнопку ( кнопка AvtoFormat) стало в таком формате
Код:
Интервал поиска: 01.06.2011  0:00:00 - 31.12.2012  0:00:00
mon.0,90,180.jup,ven
 
06.06.2011 19:10 - 07.06.2011 18:50 
13.06.2011 09:40 - 14.06.2011 12:00
20.06.2011 12:10 - 21.06.2011 14:50
28.06.2011 08:10 - 29.06.2011 14:20
05.07.2011 12:20 - 06.07.2011 11:20
12.07.2011 03:20 - 13.07.2011 06:40
19.07.2011 12:10 - 20.07.2011 15:20
27.07.2011 07:20 - 28.07.2011 12:20

Примечания:
1.Удалить стоки с ненужными фразами (они во всех файлах одинаковы )
2.Надо убрать с текста все (GMT+3)
3.Вставить недостающиеся нули
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Протестируйте с разным содержимым файлов Efemer1.txt.
Код:
#include <Array.au3>

Dim $a_Delim[6] = [5, '.', '.', ' ', ':', ' - ']
$i_Count = 0
$s_Text = FileRead(@ScriptDir & '\Efemer1.txt')
$a_Temp = StringSplit(StringStripWS(StringStripCR($s_Text), 7), @LF)

Dim $a_Result[$a_Temp[0]][1]
For $i = 1 To $a_Temp[0]
	If StringRegExp($a_Temp[$i], '^Интервал поиска') Then
		$a_Result[$i_Count][0] = $a_Temp[$i]
		$i_Count += 1
	EndIf
	If StringRegExp($a_Temp[$i], '^[a-zA-Z]+\.') Then
		$a_Result[$i_Count][0] = $a_Temp[$i] & Chr(0)
		$i_Count += 1
	EndIf
	If StringIsDigit(StringLeft($a_Temp[$i], 1)) Then
		$s_NewString = ''
		$a_Temp_1 = StringRegExp($a_Temp[$i], '\d{1,2}\.\d{2}\.\d{4}\h\d{1,2}:\d{1,2}', 3)
		If UBound($a_Temp_1) = 2 Then
			For $j = 0 To 1
				$a_Temp_2 = StringSplit($a_Temp_1[$j], '.: ')
				For $q = 1 To $a_Temp_2[0]
					$s_NewString &= StringFormat('%02d', $a_Temp_2[$q]) & $a_Delim[$q]
				Next
			Next
			$s_NewString = StringTrimRight($s_NewString, 3)
			If StringRegExp($s_NewString, '^\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2} - \d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}$') Then
				$a_Result[$i_Count][0] = $s_NewString
				$i_Count += 1
			EndIf
		EndIf
	EndIf
Next
If $i_Count Then
	ReDim $a_Result[$i_Count][1]
	_ArrayDisplay($a_Result)
	$s_TextSave = ''
	For $i = 0 To $i_Count - 1
		$s_TextSave &= $a_Result[$i][0] & @CRLF
	Next
	$s_TextSave = StringTrimRight(StringReplace($s_TextSave, Chr(0), @CRLF), 2)
	$hFile = FileOpen(@ScriptDir & '\F_Efemer1.txt', 2)
	FileWrite($hFile, $s_TextSave)
	FileClose($hFile)
Else
	MsgBox(16, 'Error', 'Error')
EndIf
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Спасибо Вам за все. Нет таких слов которыми можно было бы отблагодарить вас.
Все прекрасно работает. Остается доработать кое что для нужды. Огромное человеческое СПАСИБО вам и тем кто смотрит мои сообщения ,хочет но не может отвечать( а может и не хочет). Я уж думал сделаю так .Открыт файл в вашем скрипте , удалить 1, 2, 4, 5, 8 сторки. С помошью функции файл сёч найти и удалить (GMT+3) и стоп. Дальше не для меня уже.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
В моем скрипте, где удаляются строки, ошибка, надо заменить
Код:
;...
For $i = 1 To $aDel[0]
	_GUICtrlListView_DeleteItem($hListView, $aDel[$i])
Next
;...
;на
;...
For $i = $aDel[0] To 1 Step -1
	_GUICtrlListView_DeleteItem($hListView, $aDel[$i])
Next
;...


PS
К окну сами прикрутите или помочь?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik [?]
для теста прикрепил файл
Поменяйте
Код:
;...
If StringRegExp($a_Temp[$i], '^[a-z]{3}\.') Then
;...
;на
;...
If StringRegExp($a_Temp[$i], '^[a-zA-Z]+\.') Then
;...

Подробнее распишите задачу, что загружать в окно (пустые строки?), какие файлы выбирать, данные для автоформата из окна берутся или из файла, и т.д. и т.п.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Или так :
Код:
$sText = FileRead(@ScriptDir & '\Efemer1.txt')
$sText =StringRegExpReplace( StringRegExpReplace( $sText, '(?<!\d)(\d[:.])','0$0' ), '(?:(?:Поиск|Шаг|Критерий|Интервалы).*?\s*[\r\n]+|\(.+?\))','' )
MsgBox(0,'$sText',$sText)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Подробнее распишите задачу

Поменял и появился нужная строка. Спасибо за исправление.
Я на ваш скрипт добавил несколько кнопк
Кнопка «Загрузить» должна открыт диалоговое окно с фильтром (*.txt) и загрузить
текстовой файл.

А вот приблизительная форма
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

$sFile = @ScriptDir & '\Efemer1.txt'
If Not FileExists($sFile) Then
    MsgBox(16, 'Error', 'No ' & $sFile)
    Exit
EndIf
$sText = FileRead($sFile)
$aText = StringSplit(StringStripCR($sText), @LF)

Dim $aTextItem[$aText[0]][1]
For $i = 1 To $aText[0]
    $aTextItem[$i - 1][0] = $aText[$i]
Next
$sText = ''
$aText = 0
$Form1_1 = GUICreate("Форматирование Текста", 548, 548, 192, 114)
$Input1 = GUICtrlCreateInput("", 419, 150, 105, 21)
$Input2 = GUICtrlCreateInput("", 419, 222, 105, 21)
$Label1 = GUICtrlCreateLabel("с какого числа", 419, 126, 80, 17)
$Label2 = GUICtrlCreateLabel("по какому числу", 419, 198, 87, 17)
$Button1 = GUICtrlCreateButton("Выбрать", 419, 256, 107, 31)
$nButtonOpenFile= GUICtrlCreateButton("Загрузить", 419, 315, 107, 31)
$nButtonDel= GUICtrlCreateButton("Удалить", 419, 353, 107, 31)
$nButtonSave = GUICtrlCreateButton("Сохранить", 419, 392, 107, 31)
$Button5 = GUICtrlCreateButton("EXIT", 419, 501, 107, 31)
$ListView2 = GUICtrlCreateListView("", 8, 374, 385, 165)
$nListView = GUICtrlCreateListView('', 8, 5, 384, 359, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Test', 150)
_GUICtrlListView_AddArray($hListView, $aTextItem)

$aTextItem = 0
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButtonDel
            GUICtrlSetState($nButtonDel, $GUI_DISABLE)
            GUICtrlSetState($nButtonSave, $GUI_DISABLE)
            $aDel = _GUICtrlListView_GetSelectedIndices($hListView, True)
            If $aDel[0] Then
                For $i = $aDel[0] To 1 Step -1
                    _GUICtrlListView_DeleteItem($hListView, $aDel[$i])
                Next
            EndIf
            $aDel = 0
            _GUICtrlListView_SetItemSelected($hListView, -1, False)
            GUICtrlSetState($nButtonDel, $GUI_ENABLE)
            GUICtrlSetState($nButtonSave, $GUI_ENABLE)
        Case $nButtonSave
            GUICtrlSetState($nButtonDel, $GUI_DISABLE)
            GUICtrlSetState($nButtonSave, $GUI_DISABLE)
            $iCount = _GUICtrlListView_GetItemCount($hListView)
            For $i = 0 To $iCount - 1
                $sText &= _GUICtrlListView_GetItemText($hListView, $i) & @CRLF
            Next
            $hFile = FileOpen($sFile, 2)
            FileWrite($hFile, StringTrimRight($sText, 2))
            FileClose($hFile)
            $sText = ''
            $iCount = 0
            $hFile = 0
            GUICtrlSetState($nButtonDel, $GUI_ENABLE)
            GUICtrlSetState($nButtonSave, $GUI_ENABLE)
    EndSwitch
WEnd

gregaz

Спасибо за отзыв.Отлично :smile:Вы одной строкой выполнили 1-ю часть задачи. :shok:.Но
Остались пробелы которых надо убрат.Как убрат их и форматировать текст
Вот текст ДО обработки

1.11.2011 0:30 (GMT+4) - 5.11.2011 6:50 (GMT+4)
6.11.2011 10:20 (GMT+4) - 7.11.2011 23:20 (GMT+4)
8.11.2011 6:50 (GMT+4) - 13.11.2011 18:40 (GMT+4)
14.11.2011 0:30 (GMT+4) - 15.11.2011 12:50 (GMT+4)
15.11.2011 21:10 (GMT+4) - 17.11.2011 15:00 (GMT+4)
18.11.2011 2:00 (GMT+4) - 19.11.2011 22:30 (GMT+4)
19.11.2011 23:30 (GMT+4) - 22.11.2011 1:40 (GMT+4)
22.11.2011 9:40 (GMT+4) - 23.11.2011 23:40 (GMT+4)
24.11.2011 15:20 (GMT+4) - 28.11.2011 2:00 (GMT+4)
28.11.2011 15:30 (GMT+4) - 30.11.2011 3:20 (GMT+4)
1.12.2011 19:00 (GMT+4) - 3.12.2011 9:40 (GMT+4)
3.12.2011 16:10 (GMT+4) - 5.12.2011 17:30 (GMT+4)
5.12.2011 19:40 (GMT+4) - 7.12.2011 14:40 (GMT+4)
9.12.2011 4:20 (GMT+4) - 14.12.2011 16:30 (GMT+4)
16.12.2011 3:50 (GMT+4) - 19.12.2011 10:40 (GMT+4)
19.12.2011 21:50 (GMT+4) - 21.12.2011 6:00 (GMT+4)

И вот оно после обработки

01.11.2011 00:30 - 05.11.2011 06:50
06.11.2011 10:20 - 07.11.2011 23:20
08.11.2011 06:50 - 13.11.2011 18:40
14.11.2011 00:30 - 15.11.2011 12:50
15.11.2011 21:10 - 17.11.2011 15:00
18.11.2011 02:00 - 19.11.2011 22:30
19.11.2011 23:30 - 22.11.2011 01:40
22.11.2011 09:40 - 23.11.2011 23:40
24.11.2011 15:20 - 28.11.2011 02:00
28.11.2011 15:30 - 30.11.2011 03:20
01.12.2011 19:00 - 03.12.2011 09:40
03.12.2011 16:10 - 05.12.2011 17:30
05.12.2011 19:40 - 07.12.2011 14:40
09.12.2011 04:20 - 14.12.2011 16:30
16.12.2011 03:50 - 19.12.2011 10:40
19.12.2011 21:50 - 21.12.2011 06:00
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
А интервалы могут перекрывать друг друга? Типа:
22.11.2011 20:10 - 26.11.2011 20:40
26.11.2011 19:50 - 27.11.2011 23:20
29.11.2011 01:40 - 30.11.2011 04:20
Если да, то что с ними делать?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Протестируйте обработку периодов.
Код:
#include <GUIConstantsEx.au3>
#include <GuiDateTimePicker.au3>
#include <GuiListView.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>
#include <Date.au3>

Opt('TrayMenuMode', 1)

Global $fLV_1, $fLV_2, $aFileArray[1][1], $sTitleScript = @ScriptName & '{[/@$@\]}', _
		$sTitle = 'Форматирование Текста'
Dim $aRange[14] = [True]

If WinExists($sTitleScript) Then Exit
AutoItWinSetTitle($sTitleScript)

$hGui = GUICreate($sTitle, 530, 530)

$nButtonOpenFile = GUICtrlCreateButton('Загрузить файл', 395, 10, 100, 30)

GUICtrlCreateLabel('Начало периода', 370, 50, 150, 20, $SS_CENTER)
$nDateStart = GUICtrlCreateDate('', 370, 70, 80, 22)
$hDateStart = GUICtrlGetHandle($nDateStart)
_GUICtrlDTP_SetFormat($hDateStart, 'dd.MM.yyyy')
$nTimeStart = GUICtrlCreateDate('', 460, 70, 60, 22, $DTS_TIMEFORMAT)
$hTimeStart = GUICtrlGetHandle($nTimeStart)
_GUICtrlDTP_SetFormat($hTimeStart, 'HH:mm')

GUICtrlCreateLabel('Конец периода', 370, 100, 150, 20, $SS_CENTER)
$nDateEnd = GUICtrlCreateDate('', 370, 120, 80, 22)
$hDateEnd = GUICtrlGetHandle($nDateEnd)
_GUICtrlDTP_SetFormat($hDateEnd, 'dd.MM.yyyy')

$nTimeEnd = GUICtrlCreateDate('', 460, 120, 60, 22, $DTS_TIMEFORMAT)
$hTimeEnd = GUICtrlGetHandle($nTimeEnd)
_GUICtrlDTP_SetFormat($hTimeEnd, 'HH:mm')

$nButtonPeriod = GUICtrlCreateButton('Выбрать', 395, 155, 100, 30)
$nButtonSave = GUICtrlCreateButton('Сохранить', 395, 218, 100, 30)

$nButtonDel = GUICtrlCreateButton('Удалить', 395, 280, 100, 30)

$nListView = GUICtrlCreateListView('', 10, 10, 350, 300, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, '', 325)

$nListView_2 = GUICtrlCreateListView('', 10, 320, 350, 200, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView_2 = GUICtrlGetHandle($nListView_2)
_GUICtrlListView_AddColumn($hListView_2, '', 325)

$nButtonExit = GUICtrlCreateButton('EXIT', 395, 490, 100, 30)

For $i = $nButtonOpenFile + 1 To $nButtonDel
	GUICtrlSetState($i, $GUI_HIDE)
Next

GUISetState()
_WinAPI_EmptyWorkingSet()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $nButtonExit
			Exit
		Case $nButtonOpenFile
			GUICtrlSetState($nButtonOpenFile, $GUI_DISABLE)
			$sFile = FileOpenDialog('Выберите файл для обработки', _
					@ScriptDir & '\', 'Текстовые файлы (*.txt)', 1, '', $hGui)
			If @error Then
				TrayTip($sTitle, 'Ошибка в выборе файла', 5, 3)
				GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
				ContinueLoop
			EndIf
			_File_To_Array($aFileArray, $sFile)
			If @error Then
				TrayTip($sTitle, 'Ошибка в функции _File_To_Array', 5, 3)
				GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
				ContinueLoop
			EndIf
			If $fLV_1 Then
				_GUICtrlListView_DeleteAllItems($hListView)
			EndIf
			If $fLV_2 Then
				_GUICtrlListView_DeleteAllItems($hListView_2)
				_GUICtrlListView_SetColumn($hListView_2, 0, '')
			EndIf
			_GUICtrlListView_SetColumn($hListView, 0, _WinAPI_PathCompactPathEx($sFile, 55))
			_GUICtrlListView_AddArray($hListView, $aFileArray)
			$sString = StringReplace($aFileArray[0][0], 'Интервал поиска:', '')
			$sStartTime = _Format_Valid($sString, 0)
			$sEndTime = _Format_Valid($sString, 1)
			GUICtrlSetData($nDateStart, $sStartTime)
			GUICtrlSetData($nTimeStart, $sStartTime)
			GUICtrlSetData($nDateEnd, $sEndTime)
			GUICtrlSetData($nTimeEnd, $sEndTime)
			$fLV_1 = True
			$sString = ''
			$sFirstDate = ''
			$sEndDate = ''
			ReDim $aFileArray[1][1]
			For $i = $nButtonOpenFile + 1 To $nButtonDel
				GUICtrlSetState($i, $GUI_SHOW)
			Next
			GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
			_WinAPI_EmptyWorkingSet()
		Case $nButtonPeriod
			_Get_Reriod()
			If @error Then
				TrayTip($sTitle, 'Ошибка в функции _Get_Reriod', 5, 3)
			EndIf
			_WinAPI_EmptyWorkingSet()
		Case $nDateStart
			$s_DateRead = GUICtrlRead($nDateStart)
			$a_DateRead = StringSplit($s_DateRead, '.')
			For $i = 1 To $a_DateRead[0]
				$aRange[($a_DateRead[0] - $i) + 1] = Number($a_DateRead[$i])
			Next
			_GUICtrlDTP_SetRange($hDateEnd, $aRange)
			$s_DateRead = ''
			$a_DateRead = 0
		Case $nButtonDel
			GUICtrlSetState($nButtonDel, $GUI_DISABLE)
			GUICtrlSetState($nButtonSave, $GUI_DISABLE)
			$aDel = _GUICtrlListView_GetSelectedIndices($hListView, True)
			If $aDel[0] Then
				For $i = $aDel[0] To 1 Step -1
					If $aDel[$i] > 2 Then
						_GUICtrlListView_DeleteItem($hListView, $aDel[$i])
					EndIf
				Next
			EndIf
			$aDel = 0
			_GUICtrlListView_SetItemSelected($hListView, -1, False)
			GUICtrlSetState($nButtonDel, $GUI_ENABLE)
			GUICtrlSetState($nButtonSave, $GUI_ENABLE)
		Case $nButtonSave
			$sText = ''
			GUICtrlSetState($nButtonDel, $GUI_DISABLE)
			GUICtrlSetState($nButtonSave, $GUI_DISABLE)
			$iCount = _GUICtrlListView_GetItemCount($hListView)
			For $i = 0 To $iCount - 1
				$sText &= _GUICtrlListView_GetItemText($hListView, $i) & @CRLF
			Next
			$hFile = FileOpen($sFile, 2)
			FileWrite($hFile, StringTrimRight($sText, 2))
			FileClose($hFile)
			$sText = ''
			$iCount = 0
			$hFile = 0
			GUICtrlSetState($nButtonDel, $GUI_ENABLE)
			GUICtrlSetState($nButtonSave, $GUI_ENABLE)
	EndSwitch
WEnd

Func _Get_Reriod()
	Local $s_StartTime, $s_EndTime, $i_End_m, $f_End = True, $a_String, $i_CountString, $a_Temp, _
			$aResult, $i_Count

	$s_StartTime = GUICtrlRead($nDateStart) & ' ' & GUICtrlRead($nTimeStart)
	$s_EndTime = GUICtrlRead($nDateEnd) & ' ' & GUICtrlRead($nTimeEnd)
	$s_StartTime = _Format_Valid($s_StartTime, 0)
	If Not $s_StartTime Then Return SetError(1)
	$s_EndTime = _Format_Valid($s_EndTime, 0)
	If Not $s_EndTime Then Return SetError(1)
	$i_End_m = _DateDiff('n', $s_StartTime, $s_EndTime)
	$i_CountString = _GUICtrlListView_GetItemCount($hListView)
	If $i_CountString < 4 Then Return SetError(1)
	Dim $a_String[$i_CountString - 2] = [$i_CountString - 3]
	For $i = 3 To $i_CountString - 1
		$a_String[$i - 2] = _GUICtrlListView_GetItemText($hListView, $i)
	Next
	Dim $a_Temp[$a_String[0] + 1][8] = [[$a_String[0], $i_End_m, '', 0]]
	For $i = 1 To $a_String[0]
		$a_Temp[$i][0] = _Format_Valid($a_String[$i], 0)
		$a_Temp[$i][1] = _DateDiff('n', $s_StartTime, $a_Temp[$i][0])
		$a_Temp[$i][2] = _Format_Valid($a_String[$i], 1)
		$a_Temp[$i][3] = _DateDiff('n', $s_StartTime, $a_Temp[$i][2])
		If $f_End Then
			If $a_Temp[$i][1] > 0 And $a_Temp[$i][1] - $a_Temp[$i - 1][3] > 1 And _
					$a_Temp[$i - 1][3] < $i_End_m Then
				If $a_Temp[$i - 1][3] < $i_End_m Then
					$a_Temp[$i][5] = $a_Temp[$i - 1][3] + 1
				ElseIf $a_Temp[$i - 1][3] = 0 Then
					$a_Temp[$i][5] = $a_Temp[$i - 1][3]
				EndIf
				If $a_Temp[$i][5] < 0 Then
					$a_Temp[$i][5] = 0
				EndIf
				$a_Temp[$i][4] = _DateAdd('n', $a_Temp[$i][5], $s_StartTime)
				$a_Temp[$i][7] = $a_Temp[$i][1] - 1
				If $a_Temp[$i][7] < $i_End_m Then
					$a_Temp[$i][6] = _DateAdd('n', $a_Temp[$i][7], $s_StartTime)
				ElseIf $a_Temp[$i][7] > $i_End_m Then
					$a_Temp[$i][7] = $i_End_m
					$a_Temp[$i][6] = $s_EndTime
					$f_End = False
				EndIf
			EndIf
		EndIf
	Next
	If $a_Temp[$a_Temp[0][0]][3] < $i_End_m Then
		ReDim $a_Temp[$a_Temp[0][0] + 2][8]
		$a_Temp[$a_Temp[0][0] + 1][4] = _DateAdd('n', $a_Temp[$a_Temp[0][0]][3] + 1, $s_StartTime)
		$a_Temp[$a_Temp[0][0] + 1][6] = $s_EndTime
		$a_Temp[0][0] += 1
	EndIf
	Dim $a_Result[$a_Temp[0][0]][1]
	For $i = 1 To $a_Temp[0][0]
		If $a_Temp[$i][4] And $a_Temp[$i][6] Then
			$a_Result[$i_Count][0] = StringFormat('%s - %s', _Format_Back($a_Temp[$i][4]), _
					_Format_Back($a_Temp[$i][6]))
			$i_Count += 1
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Result[$i_Count][1]
		If $fLV_2 Then
			_GUICtrlListView_DeleteAllItems($hListView_2)
		EndIf
		_GUICtrlListView_SetColumn($hListView_2, 0, StringFormat('%s - %s', _Format_Back($s_StartTime), _
				_Format_Back($s_EndTime)))
		_GUICtrlListView_AddArray($hListView_2, $a_Result)
		$fLV_2 = True
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_Get_Reriod

Func _Format_Back($s_String)
	Local $s_Pattern = '^(\d{4})/(\d{2})/(\d{2})(.*?)$', $s_Replace = '$3.$2.$1$4', _
			$s_Return
	Return StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
EndFunc   ;==>_Format_Back

Func _File_To_Array(ByRef $a_Result, $s_FileName)
	Local $h_File, $s_Text, $i_Count, $a_Temp, $s_NewString

	$h_File = FileOpen($s_FileName)
	If $h_File = -1 Then Return SetError(1)
	$s_Text = FileRead($s_FileName)
	FileClose($h_File)
	If Not $s_Text Then Return SetError(1)
	$s_Text = StringRegExpReplace($s_Text, '(?<!\d)(\d[:.])', '0$0')
	$s_Text = StringStripWS(StringStripCR($s_Text), 7)
	If StringRight($s_Text, 1) = @LF Then
		While StringRight($s_Text, 1) = @LF
			$s_Text = StringTrimRight($s_Text, 1)
		WEnd
	EndIf
	$a_Temp = StringSplit($s_Text, @LF)
	ReDim $a_Result[$a_Temp[0] + 10][1]
	For $i = 1 To $a_Temp[0]
		If StringRegExp($a_Temp[$i], '^Интервал поиска') Then
			$a_Result[$i_Count][0] = $a_Temp[$i]
			$i_Count += 1
		EndIf
		If StringRegExp($a_Temp[$i], '^[a-zA-Z]+\.') Then
			$a_Result[$i_Count][0] = $a_Temp[$i]
			$i_Count += 1
			$a_Result[$i_Count][0] = ''
			$i_Count += 1
		EndIf
		If StringIsDigit(StringLeft($a_Temp[$i], 2)) Then
			$s_NewString = StringRegExpReplace($a_Temp[$i], '^(\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}).*?(\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}).*?$', '$1 - $2')
			If @extended = 2 Then
				$a_Result[$i_Count][0] = $s_NewString
				$i_Count += 1
			EndIf
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Result[$i_Count][1]
		Return $a_Result
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_File_To_Array

Func _Format_Valid($s_String, $i_Flag)
	;$i_Flag = 0 в дата в начале
	;$i_Flag <> 0 в дата в конце
	Local $s_Pattern = '(\d{2})\.(\d{2})\.(\d{4})(\h\d{2}:\d{2}).*', $s_Replace = '$3/$2/$1$4', _
			$s_Return
	If $i_Flag Then
		$s_Pattern = '.+' & $s_Pattern
	Else
		$s_Pattern = '^' & $s_Pattern; & '$'
	EndIf
	$s_Return = StringRegExpReplace(StringStripWS($s_String, 7), $s_Pattern, $s_Replace)
	If _DateIsValid($s_Return) Then
		Return $s_Return
	Else
		Return ''
	EndIf
EndFunc   ;==>_Format_Valid
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles

Уж я не знаю кому сказать что, вы гений… :shok: :shok: :shok:просто нет слов :thumbs_up:…а дальше все уважительные слова, маэстро. Все гениально ( с одним но ). :scratch:
Прикрепил файл для теста. Возьмите период 20.11.2011 06:30 – 08.12.2011 22:35. и вы увидите что , в начало и конец добавляются периоды которых нет в первом списке. Я в файле уже заменил :smile:
интервал поиска на 20.11.2011 6:30:00 – 08.12.2011 22:35:00.( Test_EfemB.txt )
интервал поиска на 27.11.2011 9:30:00 – 06.12.2011 17:50:00 ( Test_EfemA.txt )

И еще. Не смог запустит копию файла. Как можно запустит 2-ю,3-ю, …9-ю копию ( как класс) этого файла
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Завтра посмотрю, сегодня не могу, сегодня у меня :beer: :smile:

StarEdik [?]
И еще. Не смог запустит копию файла. Как можно запустит 2-ю,3-ю, …9-ю копию ( как класс) этого файла
Уберите это:
Код:
;...
$sTitleScript = @ScriptName & '{[/@$@\]}'
;...
If WinExists($sTitleScript) Then Exit
AutoItWinSetTitle($sTitleScript)
;...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Протестируйте этот вариант:
Код:
#include <GUIConstantsEx.au3>
#include <GuiDateTimePicker.au3>
#include <GuiListView.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>
#include <Date.au3>

Opt('TrayMenuMode', 1)

Global $fLV_1, $fLV_2, $aFileArray[1][1], _ ;$sTitleScript = @ScriptName & '{[/@$@\]}', _
		$sTitle = 'Форматирование Текста'
Dim $aRange[14] = [True]

;If WinExists($sTitleScript) Then Exit
;AutoItWinSetTitle($sTitleScript)

$hGui = GUICreate($sTitle, 530, 530)

$nButtonOpenFile = GUICtrlCreateButton('Загрузить файл', 395, 10, 100, 30)

GUICtrlCreateLabel('Начало периода', 370, 50, 150, 20, $SS_CENTER)
$nDateStart = GUICtrlCreateDate('', 370, 70, 80, 22)
$hDateStart = GUICtrlGetHandle($nDateStart)
_GUICtrlDTP_SetFormat($hDateStart, 'dd.MM.yyyy')
$nTimeStart = GUICtrlCreateDate('', 460, 70, 60, 22, $DTS_TIMEFORMAT)
$hTimeStart = GUICtrlGetHandle($nTimeStart)
_GUICtrlDTP_SetFormat($hTimeStart, 'HH:mm')

GUICtrlCreateLabel('Конец периода', 370, 100, 150, 20, $SS_CENTER)
$nDateEnd = GUICtrlCreateDate('', 370, 120, 80, 22)
$hDateEnd = GUICtrlGetHandle($nDateEnd)
_GUICtrlDTP_SetFormat($hDateEnd, 'dd.MM.yyyy')

$nTimeEnd = GUICtrlCreateDate('', 460, 120, 60, 22, $DTS_TIMEFORMAT)
$hTimeEnd = GUICtrlGetHandle($nTimeEnd)
_GUICtrlDTP_SetFormat($hTimeEnd, 'HH:mm')

$nButtonPeriod = GUICtrlCreateButton('Выбрать', 395, 155, 100, 30)
$nButtonSave = GUICtrlCreateButton('Сохранить', 395, 218, 100, 30)

$nButtonDel = GUICtrlCreateButton('Удалить', 395, 280, 100, 30)
$nButtonExit = GUICtrlCreateButton('EXIT', 395, 490, 100, 30)
$nListView = GUICtrlCreateListView('', 10, 10, 350, 300, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, '', 325)

$nListView_2 = GUICtrlCreateListView('', 10, 320, 350, 200, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView_2 = GUICtrlGetHandle($nListView_2)
_GUICtrlListView_AddColumn($hListView_2, '', 325)

For $i = $nButtonOpenFile + 1 To $nButtonDel
	GUICtrlSetState($i, $GUI_HIDE)
Next

GUISetState()
_WinAPI_EmptyWorkingSet()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $nButtonExit
			Exit
		Case $nButtonOpenFile
			GUICtrlSetState($nButtonOpenFile, $GUI_DISABLE)
			$sFile = FileOpenDialog('Выберите файл для обработки', _
					@ScriptDir & '\', 'Текстовые файлы (*.txt)', 1, '', $hGui)
			If @error Then
				TrayTip($sTitle, 'Ошибка в выборе файла', 5, 3)
				GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
				ContinueLoop
			EndIf
			_File_To_Array($aFileArray, $sFile)
			If @error Then
				TrayTip($sTitle, 'Ошибка в функции _File_To_Array', 5, 3)
				GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
				ContinueLoop
			EndIf
			If $fLV_1 Then
				_GUICtrlListView_DeleteAllItems($hListView)
			EndIf
			If $fLV_2 Then
				_GUICtrlListView_DeleteAllItems($hListView_2)
				_GUICtrlListView_SetColumn($hListView_2, 0, '')
			EndIf
			_GUICtrlListView_SetColumn($hListView, 0, _WinAPI_PathCompactPathEx($sFile, 55))
			_GUICtrlListView_AddArray($hListView, $aFileArray)
			$sString = StringReplace($aFileArray[0][0], 'Интервал поиска:', '')
			$sStartTime = _Format_Valid($sString, 0)
			$sEndTime = _Format_Valid($sString, 1)
			GUICtrlSetData($nDateStart, $sStartTime)
			GUICtrlSetData($nTimeStart, $sStartTime)
			GUICtrlSetData($nDateEnd, $sEndTime)
			GUICtrlSetData($nTimeEnd, $sEndTime)
			$fLV_1 = True
			$sString = ''
			$sFirstDate = ''
			$sEndDate = ''
			ReDim $aFileArray[1][1]
			For $i = $nButtonOpenFile + 1 To $nButtonDel
				GUICtrlSetState($i, $GUI_SHOW)
			Next
			GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
			_WinAPI_EmptyWorkingSet()
		Case $nButtonPeriod
			_Control_En_Dis(0)
			_Get_Reriod()
			If @error Then
				TrayTip($sTitle, 'Ошибка в функции _Get_Reriod', 5, 3)
			EndIf
			_Control_En_Dis(1)
			_WinAPI_EmptyWorkingSet()
		Case $nDateStart
			$s_DateRead = GUICtrlRead($nDateStart)
			$a_DateRead = StringSplit($s_DateRead, '.')
			For $i = 1 To $a_DateRead[0]
				$aRange[($a_DateRead[0] - $i) + 1] = Number($a_DateRead[$i])
			Next
			_GUICtrlDTP_SetRange($hDateEnd, $aRange)
			$s_DateRead = ''
			$a_DateRead = 0
		Case $nButtonDel
			_Control_En_Dis(0)
			$aDel = _GUICtrlListView_GetSelectedIndices($hListView, True)
			If $aDel[0] Then
				For $i = $aDel[0] To 1 Step -1
					If $aDel[$i] > 2 Then
						_GUICtrlListView_DeleteItem($hListView, $aDel[$i])
					EndIf
				Next
			EndIf
			$aDel = 0
			_GUICtrlListView_SetItemSelected($hListView, -1, False)
			_Control_En_Dis(1)
		Case $nButtonSave
			$sText = ''
			_Control_En_Dis(0)
			$iCount = _GUICtrlListView_GetItemCount($hListView)
			For $i = 0 To $iCount - 1
				$sText &= _GUICtrlListView_GetItemText($hListView, $i) & @CRLF
			Next
			$hFile = FileOpen($sFile, 2)
			FileWrite($hFile, StringTrimRight($sText, 2))
			FileClose($hFile)
			$sText = ''
			$iCount = 0
			$hFile = 0
			_Control_En_Dis(1)
	EndSwitch
WEnd

Func _Control_En_Dis($i_Flag)
	Local $s_State = $GUI_DISABLE
	If $i_Flag Then $s_State = $GUI_ENABLE
	For $i = $nButtonOpenFile To $nButtonExit
		GUICtrlSetState($i, $s_State)
	Next
EndFunc   ;==>_Control_En_Dis

Func _Get_Reriod()
	Local $s_StartTime, $s_EndTime, $i_End_m, $f_End = True, $a_String, $i_CountString, $a_Temp, _
			$aResult, $i_Count

	$s_StartTime = GUICtrlRead($nDateStart) & ' ' & GUICtrlRead($nTimeStart)
	$s_EndTime = GUICtrlRead($nDateEnd) & ' ' & GUICtrlRead($nTimeEnd)
	$s_StartTime = _Format_Valid($s_StartTime, 0)
	If Not $s_StartTime Then Return SetError(1)
	$s_EndTime = _Format_Valid($s_EndTime, 0)
	If Not $s_EndTime Then Return SetError(1)
	$i_End_m = _DateDiff('n', $s_StartTime, $s_EndTime)
	$i_CountString = _GUICtrlListView_GetItemCount($hListView)
	If $i_CountString < 4 Then Return SetError(1)
	Dim $a_String[$i_CountString - 2] = [$i_CountString - 3]
	For $i = 3 To $i_CountString - 1
		$a_String[$i - 2] = _GUICtrlListView_GetItemText($hListView, $i)
	Next
	Dim $a_Temp[$a_String[0] + 1][8] = [[$a_String[0], $i_End_m, '', 0]]
	For $i = 1 To $a_String[0]
		$a_Temp[$i][0] = _Format_Valid($a_String[$i], 0)
		$a_Temp[$i][1] = _DateDiff('n', $s_StartTime, $a_Temp[$i][0])
		$a_Temp[$i][2] = _Format_Valid($a_String[$i], 1)
		$a_Temp[$i][3] = _DateDiff('n', $s_StartTime, $a_Temp[$i][2])
		If $f_End Then
			If $a_Temp[$i][1] > 0 And $a_Temp[$i][1] - $a_Temp[$i - 1][3] > 1 And _
					$a_Temp[$i - 1][3] < $i_End_m Then
				If $a_Temp[$i - 1][3] < $i_End_m And $a_Temp[$i - 1][3] > 0 Then
					$a_Temp[$i][5] = $a_Temp[$i - 1][3] + 1
				ElseIf $a_Temp[$i - 1][3] = 0 Then
					$a_Temp[$i][5] = $a_Temp[$i - 1][3]
				EndIf
				If $a_Temp[$i][5] < 0 Then
					$a_Temp[$i][5] = 0
				EndIf
				$a_Temp[$i][4] = _DateAdd('n', $a_Temp[$i][5], $s_StartTime)
				$a_Temp[$i][7] = $a_Temp[$i][1] - 1
				If $a_Temp[$i][7] < $i_End_m Then
					$a_Temp[$i][6] = _DateAdd('n', $a_Temp[$i][7], $s_StartTime)
				ElseIf $a_Temp[$i][7] > $i_End_m Then
					$a_Temp[$i][7] = $i_End_m
					$a_Temp[$i][6] = $s_EndTime
					$f_End = False
				EndIf
			EndIf
		EndIf
	Next
	If $a_Temp[$a_Temp[0][0]][3] < $i_End_m Then
		ReDim $a_Temp[$a_Temp[0][0] + 2][8]
		$a_Temp[$a_Temp[0][0] + 1][4] = _DateAdd('n', $a_Temp[$a_Temp[0][0]][3] + 1, $s_StartTime)
		$a_Temp[$a_Temp[0][0] + 1][6] = $s_EndTime
		$a_Temp[0][0] += 1
	EndIf
	Dim $a_Result[$a_Temp[0][0]][1]
	For $i = 1 To $a_Temp[0][0]
		If $a_Temp[$i][4] And $a_Temp[$i][6] Then
			$a_Result[$i_Count][0] = StringFormat('%s - %s', _Format_Back($a_Temp[$i][4]), _
					_Format_Back($a_Temp[$i][6]))
			$i_Count += 1
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Result[$i_Count][1]
		If $fLV_2 Then
			_GUICtrlListView_DeleteAllItems($hListView_2)
		EndIf
		_GUICtrlListView_SetColumn($hListView_2, 0, StringFormat('%s - %s', _Format_Back($s_StartTime), _
				_Format_Back($s_EndTime)))
		_GUICtrlListView_AddArray($hListView_2, $a_Result)
		$fLV_2 = True
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_Get_Reriod

Func _Format_Back($s_String)
	Local $s_Pattern = '^(\d{4})/(\d{2})/(\d{2})(.*?)$', $s_Replace = '$3.$2.$1$4', _
			$s_Return
	Return StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
EndFunc   ;==>_Format_Back

Func _File_To_Array(ByRef $a_Result, $s_FileName)
	Local $h_File, $s_Text, $i_Count, $a_Temp, $s_NewString, $a_Test

	$h_File = FileOpen($s_FileName)
	If $h_File = -1 Then Return SetError(1)
	$s_Text = FileRead($s_FileName)
	FileClose($h_File)
	If Not $s_Text Then Return SetError(1)
	$s_Text = StringRegExpReplace($s_Text, '(?<!\d)(\d[:.])', '0$0')
	$s_Text = StringStripCR($s_Text)
	If StringRight($s_Text, 1) = @LF Then
		While StringRight($s_Text, 1) = @LF
			$s_Text = StringTrimRight($s_Text, 1)
		WEnd
	EndIf
	$a_Temp = StringSplit($s_Text, @LF)
	ReDim $a_Result[$a_Temp[0] + 10][1]
	For $i = 1 To $a_Temp[0]
		$a_Temp[$i] = StringStripWS($a_Temp[$i], 7)
		If StringRegExp($a_Temp[$i], 'Интервал поиска') Then
			$a_Test = StringRegExp($a_Temp[$i], '\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}:\d{2}', 3)
			If @error Then
				$a_Temp[$i] = StringRegExpReplace($a_Temp[$i], '(\d{2}\.\d{2}\.\d{4})', '$0 00:00')
			ElseIf UBound($a_Test) < 2 Then
				$a_Temp[$i] = StringReplace($a_Temp[$i], $a_Test[0], Chr(0))
				$a_Temp[$i] = StringRegExpReplace($a_Temp[$i], '(\d{2}\.\d{2}\.\d{4})', '$0 00:00')
				$a_Temp[$i] = StringReplace($a_Temp[$i], Chr(0), $a_Test[0])
			EndIf
			$a_Result[$i_Count][0] = $a_Temp[$i]
			$i_Count += 1
			If $i > 1 Then
				If $a_Temp[0] > $i + 3 Then
					If Not StringIsDigit(StringLeft($a_Temp[$i + 3], 2)) Then
						$a_Result[$i_Count][0] = $a_Temp[$i + 3]
						$i_Count += 1
						$a_Result[$i_Count][0] = ''
						$i_Count += 1
					EndIf
				EndIf
			ElseIf $i = 1 Then
				If $a_Temp[0] > $i + 1 Then
					If Not StringIsDigit(StringLeft($a_Temp[$i + 1], 2)) Then
						$a_Result[$i_Count][0] = $a_Temp[$i + 1]
						$i_Count += 1
						$a_Result[$i_Count][0] = ''
						$i_Count += 1
					EndIf
				EndIf
			EndIf
		EndIf
		If StringIsDigit(StringLeft($a_Temp[$i], 2)) Then
			$s_NewString = StringRegExpReplace($a_Temp[$i], '^(\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}).*?(\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}).*?$', '$1 - $2')
			If @extended = 2 Then
				$a_Result[$i_Count][0] = $s_NewString
				$i_Count += 1
			EndIf
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Result[$i_Count][1]
		Return $a_Result
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_File_To_Array

Func _Format_Valid($s_String, $i_Flag)
	;$i_Flag = 0 в дата в начале
	;$i_Flag <> 0 в дата в конце
	Local $s_Pattern = '(\d{2})\.(\d{2})\.(\d{4})(\h\d{2}:\d{2}).*', $s_Replace = '$3/$2/$1$4', _
			$s_Return
	If $i_Flag Then
		$s_Pattern = '.+' & $s_Pattern
	Else
		$s_Pattern = '^' & $s_Pattern; & '$'
	EndIf
	$s_Return = StringRegExpReplace(StringStripWS($s_String, 7), $s_Pattern, $s_Replace)
	If _DateIsValid($s_Return) Then
		Return $s_Return
	Else
		Return ''
	EndIf
EndFunc   ;==>_Format_Valid
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
:smile:
Привет. Отлично.Все исправили. Я не перестаю удивляться вами, :shok: как вы успеваете всему этому. :scratch:
За ранее извиняюсь за причиненный вам неудобства. Исправьте пожалуйста это и тему можно будет закрыт.
Должно быть так или если этого невозможно выдавать ошибку « выбери даты правильно »
24.11.2011 00:41- 26.11.2011 19:49
28.11.2011 23:21- 29.11.2011 01:39
30.11.2011 04:21- 04.12.2011 13:19
05.12.2011 18:31- 06.12.2011 19:30
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik [?]
А должно быть так
Вы меняете задачу. Здесь надо добавлять более ранний период, а теперь уже нет. Вы определитесь точнее, я замучился этот период вычислять, а он теперь не нужен. :mad:
Я сделаю ограничения на ввод начальной и конечной даты поиска.

Тестируйте.
Код:
#include <GUIConstantsEx.au3>
#include <GuiDateTimePicker.au3>
#include <GuiListView.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>
#include <Date.au3>

Opt('TrayMenuMode', 1)

Global $fLV_1, $fLV_2, $aFileArray[1][1], _ ;$sTitleScript = @ScriptName & '{[/@$@\]}', _
		$sTitle = 'Форматирование Текста'
Dim $aRangeStart[14] = [True]
$aRangeStart[7] = True
Dim $aRangeEnd[14] = [True]
$aRangeEnd[7] = True
;If WinExists($sTitleScript) Then Exit
;AutoItWinSetTitle($sTitleScript)

$hGui = GUICreate($sTitle, 530, 530)

$nButtonOpenFile = GUICtrlCreateButton('Загрузить файл', 395, 10, 100, 30)

GUICtrlCreateLabel('Начало периода', 370, 50, 150, 20, $SS_CENTER)
$nDateStart = GUICtrlCreateDate('', 370, 70, 80, 22)
$hDateStart = GUICtrlGetHandle($nDateStart)
_GUICtrlDTP_SetFormat($hDateStart, 'dd.MM.yyyy')
$nTimeStart = GUICtrlCreateDate('', 460, 70, 60, 22, $DTS_TIMEFORMAT)
$hTimeStart = GUICtrlGetHandle($nTimeStart)
_GUICtrlDTP_SetFormat($hTimeStart, 'HH:mm')

GUICtrlCreateLabel('Конец периода', 370, 100, 150, 20, $SS_CENTER)
$nDateEnd = GUICtrlCreateDate('', 370, 120, 80, 22)
$hDateEnd = GUICtrlGetHandle($nDateEnd)
_GUICtrlDTP_SetFormat($hDateEnd, 'dd.MM.yyyy')

$nTimeEnd = GUICtrlCreateDate('', 460, 120, 60, 22, $DTS_TIMEFORMAT)
$hTimeEnd = GUICtrlGetHandle($nTimeEnd)
_GUICtrlDTP_SetFormat($hTimeEnd, 'HH:mm')

$nButtonPeriod = GUICtrlCreateButton('Выбрать', 395, 155, 100, 30)
$nButtonSave = GUICtrlCreateButton('Сохранить', 395, 218, 100, 30)

$nButtonDel = GUICtrlCreateButton('Удалить', 395, 280, 100, 30)
$nButtonExit = GUICtrlCreateButton('EXIT', 395, 490, 100, 30)
$nListView = GUICtrlCreateListView('', 10, 10, 350, 300, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, '', 325)

$nListView_2 = GUICtrlCreateListView('', 10, 320, 350, 200, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView_2 = GUICtrlGetHandle($nListView_2)
_GUICtrlListView_AddColumn($hListView_2, '', 325)

For $i = $nButtonOpenFile + 1 To $nButtonDel
	GUICtrlSetState($i, $GUI_HIDE)
Next

GUISetState()
_WinAPI_EmptyWorkingSet()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $nButtonExit
			Exit
		Case $nButtonOpenFile
			GUICtrlSetState($nButtonOpenFile, $GUI_DISABLE)
			$sFile = FileOpenDialog('Выберите файл для обработки', _
					@ScriptDir & '\', 'Текстовые файлы (*.txt)', 1, '', $hGui)
			If @error Then
				TrayTip($sTitle, 'Ошибка в выборе файла', 5, 3)
				GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
				ContinueLoop
			EndIf
			_File_To_Array($aFileArray, $sFile)
			If @error Then
				TrayTip($sTitle, 'Ошибка в функции _File_To_Array', 5, 3)
				GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
				$sFile = ''
				ContinueLoop
			EndIf
			If $fLV_1 Then
				_GUICtrlListView_DeleteAllItems($hListView)
			EndIf
			If $fLV_2 Then
				_GUICtrlListView_DeleteAllItems($hListView_2)
				_GUICtrlListView_SetColumn($hListView_2, 0, '')
			EndIf
			_GUICtrlListView_SetColumn($hListView, 0, _WinAPI_PathCompactPathEx($sFile, 55))
			_GUICtrlListView_AddArray($hListView, $aFileArray)
			$sStartTime = _Format_Valid(_GUICtrlListView_GetItemText($hListView, 3), 0)
			$iCount = _GUICtrlListView_GetItemCount($hListView)
			$sEndTime = _Format_Valid(_GUICtrlListView_GetItemText($hListView, $iCount - 1), 1)
			$aStartTemp = StringSplit($sStartTime & ':00', '/ :')
			$aEndTemp = StringSplit($sEndTime & ':00', '/ :')
			If $sStartTime And $sEndTime Then
				For $i = 1 To $aStartTemp[0]
					$aRangeStart[$i] = $aStartTemp[$i]
					$aRangeStart[$i + 7] = $aEndTemp[$i]
					$aRangeEnd[$i] = $aStartTemp[$i]
					$aRangeEnd[$i + 7] = $aEndTemp[$i]
				Next
				GUICtrlSetData($nDateStart, $sStartTime)
				GUICtrlSetData($nTimeStart, $sStartTime)
				GUICtrlSetData($nDateEnd, $sEndTime)
				GUICtrlSetData($nTimeEnd, $sEndTime)
				_GUICtrlDTP_SetRange($hDateStart, $aRangeStart)
				_GUICtrlDTP_SetRange($hDateEnd, $aRangeEnd)
			EndIf
			$aStartTemp = 0
			$aEndTemp = 0
			$fLV_1 = True
			$sStartTime = ''
			$sEndTime = ''
			$iCount = 0
			ReDim $aFileArray[1][1]
			For $i = $nButtonOpenFile + 1 To $nButtonDel
				GUICtrlSetState($i, $GUI_SHOW)
			Next
			GUICtrlSetState($nButtonOpenFile, $GUI_ENABLE)
			_WinAPI_EmptyWorkingSet()
		Case $nButtonPeriod
			_Control_En_Dis(0)
			_Get_Reriod()
			If @error Then
				TrayTip($sTitle, 'Ошибка в функции _Get_Reriod', 5, 3)
			EndIf
			_Control_En_Dis(1)
			_WinAPI_EmptyWorkingSet()
		Case $nDateStart, $nTimeStart
			$sStartTime = _Format_Valid(GUICtrlRead($nDateStart) & ' ' & GUICtrlRead($nTimeStart), 0)
			$aStartTemp = StringSplit($sStartTime & ':00', '/ :')
			If $sStartTime Then
				For $i = 1 To $aStartTemp[0]
					$aRangeEnd[$i] = $aStartTemp[$i]
				Next
				_GUICtrlDTP_SetRange($hDateEnd, $aRangeEnd)
				$sStartTime = ''
				$aStartTemp = 0
			EndIf
		Case $nButtonDel
			_Control_En_Dis(0)
			$aDel = _GUICtrlListView_GetSelectedIndices($hListView, True)
			If $aDel[0] Then
				For $i = $aDel[0] To 1 Step -1
					If $aDel[$i] > 2 Then
						_GUICtrlListView_DeleteItem($hListView, $aDel[$i])
					EndIf
				Next
			EndIf
			$aDel = 0
			_GUICtrlListView_SetItemSelected($hListView, -1, False)
			_Control_En_Dis(1)
		Case $nButtonSave
			$sText = ''
			_Control_En_Dis(0)
			$iCount = _GUICtrlListView_GetItemCount($hListView)
			For $i = 0 To $iCount - 1
				$sText &= _GUICtrlListView_GetItemText($hListView, $i) & @CRLF
			Next
			$hFile = FileOpen($sFile, 2)
			FileWrite($hFile, StringTrimRight($sText, 2))
			FileClose($hFile)
			$sText = ''
			$iCount = 0
			$hFile = 0
			_Control_En_Dis(1)
	EndSwitch
WEnd

Func _Control_En_Dis($i_Flag)
	Local $s_State = $GUI_DISABLE
	If $i_Flag Then $s_State = $GUI_ENABLE
	For $i = $nButtonOpenFile To $nButtonExit
		GUICtrlSetState($i, $s_State)
	Next
EndFunc   ;==>_Control_En_Dis

Func _Get_Reriod()
	Local $s_StartTime, $s_EndTime, $i_End_m, $f_End = True, $a_String, $i_CountString, $a_Temp, _
			$aResult, $i_Count

	$s_StartTime = GUICtrlRead($nDateStart) & ' ' & GUICtrlRead($nTimeStart)
	$s_EndTime = GUICtrlRead($nDateEnd) & ' ' & GUICtrlRead($nTimeEnd)
	$s_StartTime = _Format_Valid($s_StartTime, 0)
	If Not $s_StartTime Then Return SetError(1)
	$s_EndTime = _Format_Valid($s_EndTime, 0)
	If Not $s_EndTime Then Return SetError(1)
	$i_End_m = _DateDiff('n', $s_StartTime, $s_EndTime)
	If $i_End_m <= 0 Then Return SetError(1)
	$i_CountString = _GUICtrlListView_GetItemCount($hListView)
	If $i_CountString < 4 Then Return SetError(1)
	Dim $a_String[$i_CountString - 2] = [$i_CountString - 3]
	For $i = 3 To $i_CountString - 1
		$a_String[$i - 2] = _GUICtrlListView_GetItemText($hListView, $i)
	Next
	Dim $a_Temp[$a_String[0] + 1][8] = [[$a_String[0], $i_End_m, '', 0]]
	For $i = 1 To $a_String[0]
		$a_Temp[$i][0] = _Format_Valid($a_String[$i], 0)
		$a_Temp[$i][1] = _DateDiff('n', $s_StartTime, $a_Temp[$i][0])
		$a_Temp[$i][2] = _Format_Valid($a_String[$i], 1)
		$a_Temp[$i][3] = _DateDiff('n', $s_StartTime, $a_Temp[$i][2])
		If $f_End Then
			If $a_Temp[$i][1] > 0 And $a_Temp[$i][1] - $a_Temp[$i - 1][3] > 1 And _
					$a_Temp[$i - 1][3] < $i_End_m Then
				If $a_Temp[$i - 1][3] < $i_End_m And $a_Temp[$i - 1][3] > 0 Then
					$a_Temp[$i][5] = $a_Temp[$i - 1][3] + 1
				EndIf
				If $a_Temp[$i][5] < 0 Then
					$a_Temp[$i][5] = 0
				EndIf
				$a_Temp[$i][4] = _DateAdd('n', $a_Temp[$i][5], $s_StartTime)
				$a_Temp[$i][7] = $a_Temp[$i][1] - 1
				If $a_Temp[$i][7] < $i_End_m Then
					$a_Temp[$i][6] = _DateAdd('n', $a_Temp[$i][7], $s_StartTime)
				ElseIf $a_Temp[$i][7] > $i_End_m Then
					$a_Temp[$i][7] = $i_End_m
					$a_Temp[$i][6] = $s_EndTime
					$f_End = False
				EndIf
			EndIf
		EndIf
	Next
	Dim $a_Result[$a_Temp[0][0]][1]
	For $i = 1 To $a_Temp[0][0]
		If $a_Temp[$i][4] And $a_Temp[$i][6] Then
			$a_Result[$i_Count][0] = StringFormat('%s - %s', _Format_Back($a_Temp[$i][4]), _
					_Format_Back($a_Temp[$i][6]))
			$i_Count += 1
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Result[$i_Count][1]
		If $fLV_2 Then
			_GUICtrlListView_DeleteAllItems($hListView_2)
		EndIf
		_GUICtrlListView_SetColumn($hListView_2, 0, StringFormat('%s - %s', _Format_Back($s_StartTime), _
				_Format_Back($s_EndTime)))
		_GUICtrlListView_AddArray($hListView_2, $a_Result)
		$fLV_2 = True
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_Get_Reriod

Func _Format_Back($s_String)
	Local $s_Pattern = '^(\d{4})/(\d{2})/(\d{2})(.*?)$', $s_Replace = '$3.$2.$1$4', _
			$s_Return
	Return StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
EndFunc   ;==>_Format_Back

Func _File_To_Array(ByRef $a_Result, $s_FileName)
	Local $h_File, $s_Text, $i_Count, $a_Temp, $s_NewString, $a_Test

	$h_File = FileOpen($s_FileName)
	If $h_File = -1 Then Return SetError(1)
	$s_Text = FileRead($s_FileName)
	FileClose($h_File)
	If Not $s_Text Then Return SetError(1)
	$s_Text = StringRegExpReplace($s_Text, '(?<!\d)(\d[:.])', '0$0')
	$s_Text = StringStripCR($s_Text)
	If StringRight($s_Text, 1) = @LF Then
		While StringRight($s_Text, 1) = @LF
			$s_Text = StringTrimRight($s_Text, 1)
		WEnd
	EndIf
	$a_Temp = StringSplit($s_Text, @LF)
	ReDim $a_Result[$a_Temp[0] + 10][1]
	For $i = 1 To $a_Temp[0]
		$a_Temp[$i] = StringStripWS($a_Temp[$i], 7)
		If StringRegExp($a_Temp[$i], 'Интервал поиска') Then
			$a_Test = StringRegExp($a_Temp[$i], '\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}:\d{2}', 3)
			If @error Then
				$a_Temp[$i] = StringRegExpReplace($a_Temp[$i], '(\d{2}\.\d{2}\.\d{4})', '$0 00:00')
			ElseIf UBound($a_Test) < 2 Then
				$a_Temp[$i] = StringReplace($a_Temp[$i], $a_Test[0], Chr(0))
				$a_Temp[$i] = StringRegExpReplace($a_Temp[$i], '(\d{2}\.\d{2}\.\d{4})', '$0 00:00')
				$a_Temp[$i] = StringReplace($a_Temp[$i], Chr(0), $a_Test[0])
			EndIf
			$a_Result[$i_Count][0] = $a_Temp[$i]
			$i_Count += 1
			If $i > 1 Then
				If $a_Temp[0] > $i + 3 Then
					If Not StringIsDigit(StringLeft($a_Temp[$i + 3], 2)) Then
						$a_Result[$i_Count][0] = $a_Temp[$i + 3]
						$i_Count += 1
						$a_Result[$i_Count][0] = ''
						$i_Count += 1
					EndIf
				EndIf
			ElseIf $i = 1 Then
				If $a_Temp[0] > $i + 1 Then
					If Not StringIsDigit(StringLeft($a_Temp[$i + 1], 2)) Then
						$a_Result[$i_Count][0] = $a_Temp[$i + 1]
						$i_Count += 1
						$a_Result[$i_Count][0] = ''
						$i_Count += 1
					EndIf
				EndIf
			EndIf
		EndIf
		If StringIsDigit(StringLeft($a_Temp[$i], 2)) Then
			$s_NewString = StringRegExpReplace($a_Temp[$i], '^(\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}).*?(\d{2}\.\d{2}\.\d{4}\h\d{2}:\d{2}).*?$', '$1 - $2')
			If @extended = 2 Then
				$a_Result[$i_Count][0] = $s_NewString
				$i_Count += 1
			EndIf
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Result[$i_Count][1]
		Return $a_Result
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_File_To_Array

Func _Format_Valid($s_String, $i_Flag)
	;$i_Flag = 0 в дата в начале
	;$i_Flag <> 0 в дата в конце
	Local $s_Pattern = '(\d{2})\.(\d{2})\.(\d{4})(\h\d{2}:\d{2}).*', $s_Replace = '$3/$2/$1$4', _
			$s_Return
	If $i_Flag Then
		$s_Pattern = '.+' & $s_Pattern
	Else
		$s_Pattern = '^' & $s_Pattern; & '$'
	EndIf
	$s_Return = StringRegExpReplace(StringStripWS($s_String, 7), $s_Pattern, $s_Replace)
	If _DateIsValid($s_Return) Then
		Return $s_Return
	Else
		Return ''
	EndIf
EndFunc   ;==>_Format_Valid
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Спасибо. Извиняюсь за мучение :(
Тема закрыта.
 
Верх