Что нового

Как сохранить отдельные файлы по дням

bigarN

Новичок
Сообщения
50
Репутация
0
Версия AutoIt: 3.3.12.0

Описание:

Доброго времени суток.
Имеется текстовой файл. Каждый день в файл добавляется новые данные. Из этого файла надобна получить и сохранить отдельные файлы по дням. Искал по форуму, но ничего подобного не нашел. Предоставляю вам фрагмент 2015 года.
04.06.2015 00:20 ;КО: 1452
04.06.2015 07:53 ;КО: 1452
04.06.2015 09:48 ;КО: 1452
05.06.2015 19:13 ;КО: 1422
06.06.2015 00:12 ;КО: 1452
06.06.2015 07:51 ;КО: 1422
14.06.2015 05:13 ;КО: 1422
15.06.2015 05:10 ;КО: 1300
15.06.2015 07:41 ;КО: 1422
15.06.2015 09:05 ;КО: 1422
15.06.2015 12:47 ;КО: 1422
20.06.2015 06:09 ;КО: 1452
02.07.2015 19:13 ;КО: 1300
03.07.2015 04:07 ;КО: 1300
03.07.2015 14:47 ;КО: 1452
03.07.2015 19:17 ;КО: 1452
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Сохраненные файлы
Err_04.06.2015.txt
04.06.2015 00:20 ;КО: 1452
04.06.2015 07:53 ;КО: 1452
04.06.2015 09:48 ;КО: 1452

Err_05.06.2015.txt
05.06.2015 19:13 ;КО: 1422

Err_06.06.2015.txt
06.06.2015 00:12 ;КО: 1452
06.06.2015 07:51 ;КО: 1422

Err_14.06.2015.txt
14.06.2015 05:13 ;КО: 1422

Err_15.06.2015.txt
15.06.2015 05:10 ;КО: 1300
15.06.2015 07:41 ;КО: 1422
15.06.2015 09:05 ;КО: 1422
15.06.2015 12:47 ;КО: 1422

Err_20.06.2015.txt
20.06.2015 06:09 ;КО: 1452

Err_02.07.2015.txt
02.07.2015 19:13 ;КО: 1300

Err_03.07.2015.txt
03.07.2015 04:07 ;КО: 1300
03.07.2015 14:47 ;КО: 1452
03.07.2015 19:17 ;КО: 1452
Примечания:
Если имеется возможность, файлы сохранять в папке с именем года
 
A

Alofa

Гость
Код:
Global $PathToFiles = @ScriptDir & '\' ; Директория, где находится Текстовый Файл и где будут созданы папки по Годам
Global $FileIn = $PathToFiles & 'Статистика 2015.txt' ; Наш текстовой файл

$sText = FileRead($FileIn)
If @error Then Exit MsgBox(16, 'Ошибка', 'Ошибка чтения из файла!')

$asStrArray = StringRegExp($sText, '((\d{2}\.\d{2}\.\d{4})\h.*)\v?', 3)
If @error Then Exit MsgBox(48, 'Отчет', 'Нет совпадений!')

Local $sDate, $iYear, $hFile, $vCRLF
For $i = 1 To UBound($asStrArray) - 1 Step 2
	Do
		Switch $sDate
			Case False
				$sDate = $asStrArray[$i]
				$iYear = StringRegExpReplace($sDate, '\d{2}\.\d{2}\.(\d{4})', '${1}')
				If Not FileExists($PathToFiles & $iYear) Then DirCreate($PathToFiles & $iYear)
				If $hFile Then FileClose($hFile)
				$hFile = FileOpen($PathToFiles & $iYear & '\Err_' & StringRegExpReplace($sDate, '(\d{2})\.(\d{2})\.(\d{4})', '${3}-${2}-${1}') & '.txt', 2)
				If $hFile = -1 Then Exit MsgBox(16, 'Ошибка', 'Произошла ошибка создания файлов статистики!')
				ContinueCase
			Case Else
				If $sDate = $asStrArray[$i] Then
					FileWrite($hFile, $vCRLF & $asStrArray[$i - 1])
					$vCRLF = @CRLF
				Else
					$sDate = False
					$vCRLF = ''
				EndIf
		EndSwitch
	Until $sDate
Next
FileClose($hFile)

Скрипт создает папки с названиями встречающихся Годов в текстовом файле, в которых создает соответствующие TXT файлы. Названия файлов имеют формат "Err_ГГГГ-ММ-ДД" (так мне кажется удобней).

Тренировался на следующем текстовом файле:
Код:
04.06.2015 00:20 ;КО: 1452
04.06.2015 07:53 ;КО: 1452
04.06.2015 09:48 ;КО: 1452
05.06.2015 19:13 ;КО: 1422
15.06.2015 05:10 ;КО: 1300
15.06.2015 07:41 ;КО: 1422
15.06.2015 09:05 ;КО: 1422
15.06.2015 12:47 ;КО: 1422
20.06.2015 06:09 ;КО: 1452
03.07.2015 04:07 ;КО: 1300
03.07.2015 14:47 ;КО: 1452
03.07.2015 19:17 ;КО: 1452

15.06.2016 05:10 ;КО: 1300
15.06.2016 07:41 ;КО: 1422
15.06.2016 09:05 ;КО: 1422
15.06.2016 12:47 ;КО: 1422
20.06.2016 06:09 ;КО: 1452
03.07.2016 04:07 ;КО: 1300
03.07.2016 14:47 ;КО: 1452
03.07.2016 19:17 ;КО: 1452


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

Альтернативный вариант:
Ни каких папок и .TXT файлов в них - все сбрасываем в один TXT:
Код:
Global $PathToFiles = @ScriptDir & '\' ; Директория, где находится Текстовый Файл и где будут созданы папки по Годам
Global $FileIn = $PathToFiles & 'Статистика 2015.txt' ; Наш текстовой файл

$sText = FileRead($FileIn)
If @error Then Exit MsgBox(16, 'Ошибка', 'Ошибка чтения из файла!')

$asStrArray = StringRegExp($sText, '(\d{2}\.\d{2}\.\d{4})\h(.*)\v?', 3)
If @error Then Exit MsgBox(48, 'Отчет', 'Нет совпадений!')

Local $sDate, $iYear, $iYearOld, $hFile
For $i = 0 To UBound($asStrArray) - 1 Step 2
	Local $vCRLF = @CRLF
	Do
		Switch $sDate
			Case False
				$sDate = $asStrArray[$i]
				$iYear = StringRegExpReplace($sDate, '\d{2}\.\d{2}\.(\d{4})', '${1}')
				If $iYear <> $iYearOld Then
					Switch $hFile
						Case True
							FileClose($hFile)
							ContinueCase
						Case Else
							$vCRLF = ''
					EndSwitch
					$hFile = FileOpen($PathToFiles & '\' & $iYear & '.txt', 2)
					If $hFile = -1 Then Exit MsgBox(16, 'Ошибка', 'Произошла ошибка создания файлов статистики!')
					$iYearOld = $iYear
				EndIf
				FileWrite($hFile, $vCRLF & $sDate)
				ContinueCase
			Case Else
				If $sDate = $asStrArray[$i] Then
					FileWrite($hFile, @CRLF & @TAB & $asStrArray[$i + 1])
				Else
					$sDate = False
				EndIf
		EndSwitch
	Until $sDate
Next
FileClose($hFile)
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
INNI
комменти скрипт, как работает он.
Alofa
Да, все 3 примера хороши.
В 1 и 3 скрипте на некоторых файлах образовались пустые строки, которых при дальнейщем обработке напутствуют ошибкам.
А 2 скрипте с отображением все в порядке но после строк появились знак "=". К чему это?

Приложил файл для примера
 

Вложения

  • 1a.png
    1a.png
    16.3 КБ · Просмотры: 13
  • 2a.png
    2a.png
    12.8 КБ · Просмотры: 11
  • 3a.png
    3a.png
    20.4 КБ · Просмотры: 14
  • Статистика 2015.txt
    446 байт · Просмотры: 7

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
Local $hFile = FileOpen("Статистика 2015.txt", 0), $sDir = "", $sFile = "", $aFile = "", $aData = ""
If $hFile = -1 Then
	MsgBox(16, @ScriptName, "При чтении файла произошла ошибка.")
	Exit(1)
EndIf

Local $oObj = ObjCreate("Scripting.Dictionary")
While 1
	$sLine = FileReadLine($hFile)
	If @error = -1 Then ExitLoop

	$sFile = StringLeft($sLine, 10)
	$sDir  = StringRight($sFile, 4)
	$iDir = DirGetSize($sDir)
	If ($iDir = -1) And (@error = 1) Then
		DirCreate($sDir)
	EndIf

	$oObj.Item(StringFormat("%s\Err_%s.txt", $sDir, $sFile)) &= $sLine & @CRLF
WEnd

FileClose($hFile)

$aFile = $oObj.Keys
$aData = $oObj.Items

For $i = 0 To UBound($aFile)-1
	Local $hFile = FileOpen($aFile[$i], 2)
	If $hFile = -1 Then
		MsgBox(16, @ScriptName, "При чтении файла произошла ошибка.")
		Exit(2)
	EndIf
	FileWrite($hFile, $aData[$i])
	FileClose($hFile)
	Sleep(5)
Next
 
A

Alofa

Гость
Обновил скрипы в Ответе #2.

bigarN сказал(а):
... знак "=". К чему это?
Это особенность структвры документов .INI. Вот почитайте.
Про этот вариант, в предоставленном выше виде можете забыть - это изврат (моя шалость).
Хотя его можно представить и так:
Код:
[04.06.2015]
      04.06.2015 00:20 = 1452
      04.06.2015 07:53 = 1452
[05.06.2015]
      05.06.2015 19:13 = 1422
...

bigarN сказал(а):
Приложил файл для примера
Извините, уже и забыл что есть еще на свете штатный блокнот.
 
Верх