Что нового

Как сортировать (упорядочит) файл по годам ,месяцам, дням …

StarEdik

Новичок
Сообщения
365
Репутация
4
Привет всем. Имеется файл «temp2002-2015.txt» с временными интервалами в не сортированном виде . Как сортировать, упорядочит этот файл по левой колонке .
К примеру имеем не сортированный список
03.01.2002 14:55 - 03.01.2002 11:55
24.10.2014 02:10 - 26.10.2014 08:20
09.03.2015 17:25 - 12.03.2015 02:50
20.11.2014 09:35 - 22.11.2014 15:45
08.12.2011 14:00 - 09.12.2011 15:40
10.12.2010 05:40 - 11.12.2010 13:10
26.09.2014 18:45 - 29.09.2014 02:00
03.01.2002 14:50 - 03.01.2002 15:55
17.12.2014 19:10 - 20.12.2014 01:20
14.01.2015 04:45 - 16.01.2015 12:00
01.12.2012 00:00 - 03.12.2012 09:10
04.12.2010 00:20 - 08.12.2010 02:20
10.02.2015 12:10 - 12.02.2015 20:30
04.01.2002 15:45 - 04.01.2002 16:50


А должны получить вот такой список
03.01.2002 14:50 - 03.01.2002 15:55
03.01.2002 14:55 - 03.01.2002 15:00
04.01.2002 15:45 - 04.01.2002 16:50
04.12.2010 00:20 - 08.12.2010 02:20
10.12.2010 05:40 - 11.12.2010 13:10
08.10.2011 14:00 - 09.10.2011 15:40
01.12.2012 00:00 - 03.12.2012 09:10
26.09.2014 18:45 - 29.09.2014 02:00
24.10.2014 02:10 - 26.10.2014 08:20
20.11.2014 09:35 - 22.11.2014 15:45
17.12.2014 19:10 - 20.12.2014 01:20
14.01.2015 04:45 - 16.01.2015 12:00
10.02.2015 12:10 - 12.02.2015 20:30
09.03.2015 17:25 - 12.03.2015 02:50
Код формы
Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <GuiDateTimePicker.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>
#include <Date.au3>
#Include <ListViewConstants.au3>
#Include <WinAPI.au3>

;Opt('GUIOnEventMode', 1)
Opt("WinTitleMatchMode", 2)
Opt("MouseCoordMode", 2)

$Gui=GUICreate('Test', 280, 650, @DesktopHeight-5, 40)
$nButtonOpenFile= GUICtrlCreateButton('Open File', 175, 2, 100, 25)
$nButtonSort = GUICtrlCreateButton('Сортировать', 5, 610, 80, 30)
$nButtonSave = GUICtrlCreateButton('Save', 90, 610, 80, 30)
$nButtonExit = GUICtrlCreateButton('Exit', 195, 610, 80, 30)
$nListView = GUICtrlCreateListView('', 2, 30, 280, 570, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Test', 260)
$aTextItem = 0
GUISetState(@SW_SHOW, $Gui)
;............................
_WinAPI_EmptyWorkingSet()
;............................
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
			            Exit
		Case $nButtonOpenFile
				 $sFile = FileOpenDialog('Выберите файл для обработки', _
                    @ScriptDir & '\', 'Текстовые файлы (*.txt)', 1, '', $Gui)

                    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
					_GUICtrlListView_DeleteAllItems($hListView)
					_GUICtrlListView_AddArray($hListView, $aTextItem)
        Case $nButtonSort
            ; ...................

			; ....................
        Case $nButtonSave
            GUICtrlSetState($nButtonSort, $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($nButtonSort, $GUI_ENABLE)
            GUICtrlSetState($nButtonSave, $GUI_ENABLE)
     	Case $nButtonExit
			Exit
	EndSwitch
WinSetOnTop($Gui,"",1)
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3 385
Репутация
592
StarEdik
смотри http://autoit-script.ru/index.php/topic,1876.0.html ну прямо твоя тема. один в один. нашел по поиску. для поиска ввел два слова "Как сортировать". куча ссылок ;)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
StarEdik,
Попробуйте так.
Код:
#include <Array.au3>

$sText = FileRead(@ScriptDir & '\temp2002-2015.txt')
$aTemp = StringSplit(StringStripCR(StringRegExpReplace($sText, '[\r\n]*$', '')), @LF)
Dim $aResult[$aTemp[0]][2]
For $i = 1 To $aTemp[0]
	$aResult[$i - 1][0] = $aTemp[$i]
	$aResult[$i - 1][1] = Number(StringRegExpReplace($aTemp[$i], '^(\d{2})\.(\d{2})\.(\d{4})\s(\d{2}):(\d{2})\s-.*', '$3$2$1$4$5'))
Next
_ArraySort($aResult, 0, 0, 0, 1)
ReDim $aResult[$aTemp[0]][1]
_ArrayDisplay($aResult)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Так : ?
Код:
#include <Array.au3>
;$sText=ClipGet() или $sText=FileRead($sFile)
$sPatern = "(\d{2}\.)(\d{2}\.)(\d{4})(\s.+)"
$sResult = StringRegExpReplace( $sText, $sPatern, '\3 \2\1\4' )

$aArray=StringSplit($sResult, @CRLF, 1)

_ArrayDisplay($aArray, ' $aArray ')
_ArraySort($aArray, 0, 1)
_ArrayDisplay($aArray, ' $aArray ')


Остается вернуть исходную конструкцию после сортировки через Рег.Выражение
Код:
$sText=_ArrayToString($aArray, @CRLF, 1)
MsgBox(0,'',  $sText)

$sPatern = "(\d{4}\s)(\d{2}\.)(\d{2}\.)(\s.+)"
$sResult = StringRegExpReplace( $sText, $sPatern, '\3\2\1\4' )

MsgBox(0,'$sResult',  $sResult)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Александр
За полезную и интересную ссылку спасибо. :smile:

gregaz
Спасибо за код и за интересное объяснение. Благодарю :smile:

madmasles
Уважаемый, как всегда вы на высоте - профессиональное решение. :smile:

Остальное сделал так .Вроде бы работает, если что та не так подправьте пожалуйста. :-[
Код:
Case $nButtonSort
            ; ...................
;$sTextS=FileRead(@ScriptDir & '\temp2002-2015.txt')
$sTextS=FileRead($sFile)
$sPaternS = "(\d{2}\.)(\d{2}\.)(\d{4})(\s.+)"
$sResultS = StringRegExpReplace( $sTextS, $sPaternS, '\3 \2\1\4' )
$aArrayS=StringSplit($sResultS, @CRLF, 1)
_ArraySort($aArrayS, 0, 1)
$sTextSS=_ArrayToString($aArrayS, @CRLF, 1)
$sPaternSS = "(\d{4}\s)(\d{2}\.)(\d{2}\.)(\s.+)"
$sResultSS = StringRegExpReplace( $sTextSS, $sPaternSS, '\3\2\1\4' )
$aArraySS=StringSplit($sResultSS, @CRLF, 1)
;_ArrayDisplay($aArraySS, ' $aArray ')

 Dim $aTextItem[$aArraySS[0]][1]
                For $i = 1 To $aArraySS[0]
                    $aTextItem[$i - 1][0] = $aArraySS[$i]
                Next
                $sText = ''
                $aText = 0
		_GUICtrlListView_DeleteAllItems($hListView)
		_GUICtrlListView_AddArray($hListView, $aTextItem)
	; ....................
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
StarEdik,
Я бы сразу сортировал.
Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <GuiDateTimePicker.au3>
#include <StaticConstants.au3>
#include <WinAPIEx.au3>
#include <Date.au3>
#include <ListViewConstants.au3>
;#include <WinAPI.au3> не надо включать, если есть WinAPIEx.au3

;Opt('GUIOnEventMode', 1)
Opt("WinTitleMatchMode", 2)
Opt("MouseCoordMode", 2)

$Gui = GUICreate('Test', 280, 650, @DesktopHeight - 5, 40)
$nButtonOpenFile = GUICtrlCreateButton('Open File', 175, 2, 100, 25)
;$nButtonSort = GUICtrlCreateButton('Сортировать', 5, 610, 80, 30)
$nButtonSave = GUICtrlCreateButton('Save', 90, 610, 80, 30)
$nButtonExit = GUICtrlCreateButton('Exit', 195, 610, 80, 30)
$nListView = GUICtrlCreateListView('', 2, 30, 280, 570, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Test', 260)
$aTextItem = 0
GUISetState(@SW_SHOW, $Gui)
;............................
_WinAPI_EmptyWorkingSet()
;............................
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButtonOpenFile
			$sFile = FileOpenDialog('Выберите файл для обработки', _
					@ScriptDir & '\', 'Текстовые файлы (*.txt)', 1, '', $Gui)
			If @error Then ContinueLoop
			;или способом, который предложил gregaz
			$sText = FileRead(@ScriptDir & '\temp2002-2015.txt')
			$aTemp = StringSplit(StringStripCR(StringRegExpReplace($sText, '[\r\n]*$', '')), @LF)
			Dim $aResult[$aTemp[0]][2]
			For $i = 1 To $aTemp[0]
				$aResult[$i - 1][0] = $aTemp[$i]
				$aResult[$i - 1][1] = Number(StringRegExpReplace($aTemp[$i], '^(\d{2})\.(\d{2})\.(\d{4})\s(\d{2}):(\d{2})\s-.*', '$3$2$1$4$5'))
			Next
			_ArraySort($aResult, 0, 0, 0, 1)
			ReDim $aResult[$aTemp[0]][1]
			_GUICtrlListView_DeleteAllItems($hListView)
			_GUICtrlListView_AddArray($hListView, $aResult)
			$sText = ''
			$aTemp = 0
			$aResult = 0
			;Case $nButtonSort
			; ...................

			; ....................
		Case $nButtonSave
			;GUICtrlSetState($nButtonSort, $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($nButtonSort, $GUI_ENABLE)
			GUICtrlSetState($nButtonSave, $GUI_ENABLE)
		Case $nButtonExit
			Exit
	EndSwitch
	WinSetOnTop($Gui, "", 1)
WEnd
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
StarEdik [?]
если что та не так подправьте пожалуйста
Поскольку в ListView только 1 колонка, нет смысла заморачиваться двухмерным массивом.
Только для использования ф-ии : _GUICtrlListView_AddArray ?
А стоит ли ?
Проще использовать свою ф-ию.
Вообще надо оптимизировать исходя из всей задачи кол-во преобразований массива в текст

Я бы сделал примерно так :
Код:
;............................
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $nButtonExit
            Exit
        Case $nButtonOpenFile
			$sFile = FileOpenDialog('Выберите файл для обработки', _
				@ScriptDir & '\', 'Текстовые файлы (*.txt)', 1, '', $Gui)
			If Not FileExists($sFile) Then
				 MsgBox(16, 'Error', 'No ' & $sFile)
					  Exit
			EndIf
			$sFileData = FileRead($sFile)
			LV_Update($hListView, $sFileData);===>
        Case $nButtonSort
			$sPatern = "(\d{2}\.)(\d{2}\.)(\d{4})(\s.+)"
			$sResult = StringRegExpReplace( $sFileData, $sPatern, '\3 \2\1\4' )
			$aArray=StringSplit($sResult, @CRLF, 1)
			_ArraySort($aArray, 0, 1)
			$sText=_ArrayToString($aArray, @CRLF, 1)
			$sPatern = "(\d{4}\s)(\d{2}\.)(\d{2}\.)(\s.+)"
			$sResult = StringRegExpReplace( $sText, $sPatern, '\3\2\1\4' )
			$aLV=LV_Update($hListView, $sResult);===>
	Case $nButtonSave
			$sText=_ArrayToString($aLV, @CRLF, 1)
			MsgBox(0,"",$sText)
			; Запись в файл и операции с кнопками
	EndSwitch
WinSetOnTop($Gui,"",1)
WEnd

Func LV_Update($hLV, $sText)
	$aData = StringSplit($sText, @CRLF, 1)
	_GUICtrlListView_DeleteAllItems($hListView)
	For $i=1 To UBound($aData)-1
		_GUICtrlListView_AddItem($hLV, $aData[$i])
	Next
	Return $adata
EndFunc


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

madmasles [?]
Я бы сразу сортировал.
Конечно, лучше сразу заносить сортированный список.
Но это уже исходя из понимания всей задачи.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
gregaz
Благодарю :smile:

madmasles
Спасибо Уважаемый. :smile:

Обоим вам очень признателен.
 
Верх