Что нового

Помогите с проверкой текста и добавление даты

Serega1383

Новичок
Сообщения
25
Репутация
0
Как написать скрипт, такого плана. Есть текст такого вида.
01.01.2011
Класс. (постоянный текст во всех датах)
Рандомный текст.(текст напечатан вручную)

02.01.2011
Класс. (постоянный текст во всех датах)
Рандомный текст.(текст напечатан вручную)

И так далее

07.01.2011
Класс. (постоянный текст во всех датах)
Рандомный текст(может быть с датой 05.01.2011).

Нужно чтобы скрипт проверял дату, потом наличие текста и добавлял следующую дату. А самую первую удалил вместе с текстом, если она старше 6 дней текущей даты. Проблема, что в тексте тоже даты могут быть.

Чтобы получилось вот так.
Старше нынешней даты на 6 дней все удалить.
06.01.2011
Класс. (постоянный текст во всех датах)
Рандомный текст.(текст напечатан вручную)

07.01.2011
Класс. (постоянный текст во всех датах)
Рандомный текст.(текст напечатан вручную)

И тут скрипт добавил
08.01.2011 (сегодняшняя дата)
Класс. (постоянный текст во всех датах)
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Назовите файл Список.txt и закиньте скрипт в папку с файлом
Код:
#include <Array.au3>
#include <File.au3>
#include <Date.au3>

$aList = FileReadToArray(@ScriptDir & '/Список.txt')
For $i = UBound($aList) -1 To 0 Step -1
   If _IsDate($aList[$i]) Then
	  If _DateDiff('d', StringRight($aList[$i], 4) & '/' & StringMid($aList[$i], 4, 2) & '/' & StringLeft($aList[$i], 2) & ' 00:00:00', _NowCalc()) > 6 Then
		 Do
			_ArrayDelete($aList, $i)
		 Until $i = UBound($aList) OR _IsDate($aList[$i]) OR UBound($aList) = 0
	  EndIf
   EndIf
Next

_ArrayAdd($aList, "")
_ArrayAdd($aList, @MDAY & '.' & @MON & '.' & @YEAR)
_ArrayAdd($aList, "Класс. ")
_FileWriteFromArray(@ScriptDir & '/Список.txt', $aList)

Func _IsDate($sDate)
   Return ((StringLen($sDate) = 10) AND (StringRegExp($sDate, "(\d{2}\.\d{2}\.\d{4})") = 1))
EndFunc
 
Автор
S

Serega1383

Новичок
Сообщения
25
Репутация
0
Выдаёт ошибку "If" statements must have a "Then" keywords. :
If _DateDiff ('d',
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Похоже, вы скопировали не весь код.
 
Автор
S

Serega1383

Новичок
Сообщения
25
Репутация
0
С этой разобрался теперь выдает в самом начале. Unknown function name. :
$aList = FileReadToArray(@ScriptDir & '/123.txt')
$aList = ^ERROR
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Бывает такая проблема при копировании кода с форума, попробуйте вручную напечатать эту строчку и следующие где будет такая же ошибка
 
Автор
S

Serega1383

Новичок
Сообщения
25
Репутация
0
Все вручную печатал. Уже переписал не помогает
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Serega1383 сказал(а):
С этой разобрался теперь выдает в самом начале. Unknown function name. :
$aList = FileReadToArray(@ScriptDir & '/123.txt')
$aList = ^ERROR

В начале кода указаны инклюды? Файлы Array.au3, File.au3, Date.au3 есть в папке C:\Program Files (x86)\AutoIt3\Include ?

Код:
#include <Array.au3>
#include <File.au3>
#include <Date.au3>


Функция пишется с нижнего подчеркивания:
Код:
_FileReadToArray
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Говорю же, проблема в том, что Scite не понимает само название функции. Именно такая функция без подчеркивания есть в Autoit, для ее работы не нужны инклюды. Просто надо перенабрать код вручную, например
 

hedji

Продвинутый
Сообщения
409
Репутация
94
А слэш случаем не в другую сторону должен быть? Винда же.
FileReadToArray(@ScriptDir & '/123.txt') vs FileReadToArray(@ScriptDir & '\123.txt')
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Serega1383, какую версию AutoIt вы используете?
 
A

Alofa

Гость
OffTopic:
Serega1383 сказал(а):
Функция "FileReadToArray()" Появилась в v3.3.10.1


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

Serega1383 сказал(а):
... Новее поставить не смогу.
Значит замените ее (функцию) на "_FileReadToArray()".
Код:
; $aList = FileReadToArray(@ScriptDir & '/Список.txt')
Local $aList
_FileReadToArray(@ScriptDir & '/Список.txt', $aList)
 
Автор
S

Serega1383

Новичок
Сообщения
25
Репутация
0
Заработало. Но немножко делает не то, что надо.

Не удаляет дату с текстом старше 5 дней.

И в начале файла вписывает какие-то цифры рандомно.
Получается вот так.

21
04.04.2018
Класс.

А если много раз запустить, то вначале файла добавляет цифры
58
54
50
46
42
И ещё помогите реализовать.
Если к примеру надо добавить в несколько строк.
Пример.

Группа а. (название может быть любое.)
04.04.2018

Група б. (название может быть любое.)
04.04.2018
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Если используете функцию с подчеркиванием, то попробуйте такой код:
Код:
#include <Array.au3>
#include <File.au3>
#include <Date.au3>

$iDaysCount = 6            ; Количество дней
Dim $aList[0]
_FileReadToArray(@ScriptDir & '\Список.txt', $aList)
If @error Then Exit 1
_ArrayDelete($aList, 0)

For $i = UBound($aList) -1 To 0 Step -1
   If _IsDate($aList[$i]) Then
      If _DateDiff('d', StringRight($aList[$i], 4) & '/' & StringMid($aList[$i], 4, 2) & '/' & StringLeft($aList[$i], 2) & ' 00:00:00', _NowCalc()) > $iDaysCount Then
         Do
            _ArrayDelete($aList, $i)
         Until $i = UBound($aList) OR _IsDate($aList[$i]) OR UBound($aList) = 0
      EndIf
   EndIf
Next

_ArrayAdd($aList, @CRLF & @MDAY & '.' & @MON & '.' & @YEAR & @CRLF & "Группа а. ")
_ArrayAdd($aList, @CRLF & @MDAY & '.' & @MON & '.' & @YEAR & @CRLF & "Группа б. ")
_FileWriteFromArray(@ScriptDir & '/Список.txt', $aList)

Func _IsDate($sDate)
   Return ((StringLen($sDate) = 10) AND (StringRegExp($sDate, "(\d{2}\.\d{2}\.\d{4})") = 1))
EndFunc
Если не работает, прикрепите ваш файл с датами
У вас в первом сообщении написано, что разница в датах должна быть больше 6 дней, а не 5. Добавил переменную в начале скрипта, можете изменять
 
Автор
S

Serega1383

Новичок
Сообщения
25
Репутация
0
Выдаёт ошибку: array variable subscript badly formatted.
Dim $aList[0]
Dim $aList[^ ERROR
 
Автор
S

Serega1383

Новичок
Сообщения
25
Репутация
0
Надо чтоб в этом файле удалил все до даты 25.11.2018 (то есть старше 5 дней от текущей даты) и добавил сегодняшнюю дату с ниже подписью класс .



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

Вот этот файл нужно второй который. В
 

Вложения

  • 1.txt
    652 байт · Просмотры: 5
  • 1.txt
    563 байт · Просмотры: 4

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Код:
#include <Date.au3>
$sFine_IN = @ScriptDir & '\1.txt'
$sFine_OUT = @ScriptDir & '\2.txt'
$sChr = Chr(164)

$sText = FileRead($sFine_IN)
If @error Then Exit

$sText = StringRegExpReplace($sText, '(?mi)(^\d\d\.\d\d\.\d{4}\s+класс)', $sChr & '\1')
$aArray = StringRegExp($sText, $sChr & '(\d\d\.\d\d\.\d{4})([^' & $sChr & ']+)', 3)
$sText = ''

For $i = 0 To UBound($aArray) - 1 Step 2
	If _DateDiff('D', StringRegExpReplace($aArray[$i], '(\d\d)\.(\d\d)\.(\d{4})', '\3/\2/\1'), _
			_NowCalcDate()) < 6 Then $sText &= $aArray[$i] & $aArray[$i + 1]
Next
$sText &= @CRLF & @MDAY & '.' & @MON & '.' & @YEAR & @CRLF & 'Класс.' & @CRLF

FileWrite($sFine_OUT, $sText)
 
Верх