Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Функция для добавления текста в файл с учётом нумерации, на примере Scenery.cfg

Ответить
Настройки темы
[решено] Функция для добавления текста в файл с учётом нумерации, на примере Scenery.cfg

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день.

Многие энтузиасты Flight Simulator X часто сталкиваются с потребностью добавлять новые текстовые записи
в конфигурационный файл симулятора.

Помогите пожалуйста с функцией для скрипта автоматической установки сценариев.
Вся работа производится на чистом энтузиазме, и ваша помощь действительно сэкономит время многим людям.

Задача:

Есть готовый текстовый файл по пути c:\Users\All Users\Microsoft\FSX\
с именем Scenery.CFG

Имеет структуру:

Код: Выделить весь код
[General]
Title=FS9 World Scenery
Description=FS9 Scenery Data
Clean_on_Exit=TRUE

[Area.001]
Title=Default Terrain
Local=Scenery\World
Texture_ID=1
Layer=1
Active=TRUE
Required=TRUE

[Area.002]
Title=Default Scenery
Local=Scenery\BASE
Layer=2
Active=TRUE
Required=TRUE

..... СОКРАТИМ ДЛЯ УДОБСТВА

[Area.127] 
Title=Menorca X Ground 
Local=Aerosoft\Menorca X Ground 
Active=TRUE 
Layer=124 
Required=FALSE 

[Area.128] 
Title=Menorca X SC 
Local=Aerosoft\Menorca X SC 
Active=TRUE 
Layer=125 
Required=FALSE
Функции передается строка Title (название)и строка Local(относительный путь к папке).
Функция сама находит максимальное значение числа в строчках Area и Layer (по всему файлу),
после чего увеличивает Area на еденицу и Layer на еденицу.
Записывает результирующий кусочек текста в конец файла.

Результатом ее работы должно стать добавление такого кусочка текста в исходный файл c примером:

Код: Выделить весь код
[Area.129]
Title=Ibiza X Ground 
Local=Aerosoft\Ibiza X Ground 
Active=TRUE 
Layer=126 
Required=FALSE
Собственно всё.
Заранее спасибо за потраченное вами время и участие.

Отправлено: 06:58, 03-12-2010

 

Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Так ? :
Код: Выделить весь код
;$sFilePath="c:\Users\All Users\Microsoft\FSX\Scenery.CFG"
$sFilePath=@ScriptDir & "\1.txt"

$sText=FileRead($sFilePath)
MsgBox(0,'$sText',$sText)

$sPattern="(?s).+(\[.+?)"
$sFind=StringRegExpReplace($sText,$sPattern,"\1")

$sPattern="(.+[=.])(.+)"
$aFind=StringRegExp($sFind,$sPattern,3)

$sRet=''
For $i=0 To UBound($aFind)-2 Step 2
	If $i=0 Or  $i=8 Then $aFind[$i+1]+=1
	If $i=0 Then $aFind[$i+1]&= "]"
	$sRet&= $aFind[$i] & $aFind[$i+1] & @LF
Next

ConsoleWrite($sRet & @LF)

$hFile=FileOpen($sFilePath,1)
FileWrite($hFile,$sRet)
FileClose($hFile)

Отправлено: 13:04, 03-12-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Я не очень разбираюсь в синтаксисе AutoIt...

А где здесь переменная в которую задавать
Title=Ibiza X Ground
Local=Aerosoft\Ibiza X Ground
и их вывод в результирующий файл.

и где вывод вот таких строчек
Active=TRUE
Required=FALSE

?

Отправлено: 13:31, 03-12-2010 | #3


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


twister777,
Как я понял, файл Scenery.CFG имеет структуру ini-файла. Тогда можно так попробовать:
Код: Выделить весь код
Opt('MustDeclareVars', 1)

Global $sLocalNew = 'Aerosoft\Ibiza X Ground' ;новый Local
Global $sTitleNew = 'Island of Ibiza' ;новый Title
Global $sFile = @ScriptDir & '\Scenery.CFG';поменяйте на нужный Вам полный путь к файлу
Global $sRes
$sRes = _AddNewSection($sLocalNew, $sTitleNew, $sFile)
If @error Then
    MsgBox(16, 'Error', 'Error')
Else
    MsgBox(64, 'OK', 'Add new section: [Area.' & @extended & ']' & @CRLF & _
            'with new Layer: ' & $sRes)
EndIf

Func _AddNewSection($sLocal, $sTitle, $sFileCFG)
    Local $hFile, $aSectionNames, $iTempSectionNumber, $iTempLayerNumber, $iNumberSectionMax = 0, _
            $iNumberLayerMax = 0
    Local $sNewSection = 'Area.'
    Local $sComment = @CRLF & ';Next section add ' & @MDAY & '.' & @MON & '.' & @YEAR & ' ' & _
            @HOUR & ':' & @MIN
    Local $aNewData[5][2] = [['Title', $sTitle],['Local', $sLocal],['Active', 'TRUE'], _
            ['Layer'],['Required', 'FALSE']]
    If Not FileExists($sFileCFG) Then Return SetError(1)
    If Not $sTitle Then Return SetError(1)
    $hFile = FileOpen($sFileCFG, 1)
    If $hFile = -1 Then Return SetError(1)
    If FileWrite($hFile, $sComment) = 0 Then Return SetError(1)
    FileClose($hFile)
    $aSectionNames = IniReadSectionNames($sFileCFG)
    If @error Then Return SetError(1)
    For $i = 1 To $aSectionNames[0]
        $iTempSectionNumber = Number(StringRegExpReplace($aSectionNames[$i], '[^0-9]', ''))
        If $iTempSectionNumber > $iNumberSectionMax Then
            $iNumberSectionMax = $iTempSectionNumber
        EndIf
        $iTempLayerNumber = Number(IniRead($sFileCFG, $aSectionNames[$i], $aNewData[3][0], 0))
        If $iTempLayerNumber > $iNumberLayerMax Then
            $iNumberLayerMax = $iTempLayerNumber
        EndIf
    Next
    $iNumberLayerMax = $iNumberLayerMax + 1
    $iNumberSectionMax = StringFormat('%03d', $iNumberSectionMax + 1)
    $sNewSection = $sNewSection & $iNumberSectionMax
    $aNewData[3][1] = $iNumberLayerMax
    If Not IniWriteSection($sFileCFG, $sNewSection, $aNewData, 0) Then Return SetError(1)
    Return SetError(0, $iNumberSectionMax, $iNumberLayerMax)
EndFunc   ;==>_AddNewSection

Последний раз редактировалось madmasles, 03-12-2010 в 18:43.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:46, 03-12-2010 | #4


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


madmasles,
Да, это похоже на ini-файл.
Вот это, мне кажется, то, что нужно, жаль я сейчас на работе - нет возможности скомпилировать и проверить работоспособность (((

Я хочу уточнить.

-------------------------------------------------------------------
при выводе:

[Area.129] ; числовое значение меняется, а все буквы и скобки неизменны
Title=Ibiza X Ground ; 'Title=' неизменные символы , 'Ibiza X Ground' задаётся в Global
Local=Aerosoft\Ibiza X Ground ; символы после знака равно это путь, он НИКАК не связан с Title, он должен задаваться в Global,а вашем варианте они связаны
Active=TRUE ; эта строчка всегда неизменна
Layer=126 ; числовое значение меняется, а все буквы и '=' неизменны
Required=FALSE ; эта строчка всегда неизменна

-----------------------------------------------------------------------------------------------

P.S. Я даже не ожидал, что так быстро найдётся почти готовое решение, спасибо.

Отправлено: 14:22, 03-12-2010 | #5


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Цитата twister777:
Я не очень разбираюсь в синтаксисе AutoIt...
А где здесь переменная в которую задавать
Title=Ibiza X Ground
Local=Aerosoft\Ibiza X Ground
и их вывод в результирующий файл.
и где вывод вот таких строчек
Active=TRUE
Required=FALSE »
;Тогда так для наглядности :

Код: Выделить весь код
#include<Array.au3>
;$sFilePath="c:\Users\All Users\Microsoft\FSX\Scenery.CFG"
$sFilePath=@ScriptDir & "\1.txt"
;Чтение всего файла
$sText=FileRead($sFilePath)
MsgBox(0,'$sText',$sText)

; Получение текста последней ячейки (имеется ввиду , что последняя ячейка и есть Max)
$sPattern="(?s).+(\[.+?)"
$sFind=StringRegExpReplace($sText,$sPattern,"\1")
MsgBox(0,'$sFind',$sFind)
ConsoleWrite("Найденный текст ячейки : " &  @LF & $sFind & @LF)

; Получение массива всех строк последней ячейки 
$sPattern="(.+[=.])(.+)"
$aFind=StringRegExp($sFind,$sPattern,3)
_ArrayDisplay($aFind,'$aFind')

; Получение нового текста ячейки
$sRet=''
For $i=0 To UBound($aFind)-2 Step 2
	If $i=0 Or  $i=8 Then $aFind[$i+1]+=1 ; Увеличение числа для строк 1 и 5 в ячейке
	If $i=0 Then $aFind[$i+1]&= "]"; Добавление "]" к строке 1 ячейки
	; Остальные значения строк не меняются ( остаются прежними)
	$sRet &= $aFind[$i] & $aFind[$i+1] & @LF ; объединение элементов массива в строку текста
Next
MsgBox(0,'$sRet',$sRet) : Записываемый текст
ConsoleWrite("Нновый текст ячейки : " &  @LF & $sRet & @LF)

; Запись нового текста ячейки в конец файла
$hFile=FileOpen($sFilePath,1)
FileWrite($hFile,$sRet)
FileClose($hFile)
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:49, 03-12-2010 | #6


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


gregaz,
Строчка вывода 2 и 3 должна где-то задаваться - там прописываются пути и названия, они разные, в этом смысл автоматизации.
http://forum.oszone.net/post-1557491-5.html

Вам тоже спасибо за вариант решения.

После 20.00 МСК попробую оба варианта дома на практике.

Отправлено: 15:12, 03-12-2010 | #7


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Цитата twister777:
[Area.129] ; числовое значение меняется, а все буквы и скобки неизменны
Title=Ibiza X Ground ; 'Title=' неизменные символы , 'Ibiza X Ground' задаётся в Global »
Да.
Цитата twister777:
Active=TRUE ; эта строчка всегда неизменна
Layer=126 ; числовое значение меняется, а все буквы и '=' неизменны
Required=FALSE ; эта строчка всегда неизменна »
Да.
Цитата twister777:
Local=Aerosoft\Ibiza X Ground ; символы после знака равно это путь, он НИКАК не связан с Title, он должен задаваться в Global,а вашем варианте они связаны »
Здесь мне не совсем понятно.
Title=Ibiza X Ground связаны или нет с Local=Aerosoft\Ibiza X Ground?
Путь к файлу Scenery.CFG и его имя постоянны или нет?

Отправлено: 15:25, 03-12-2010 | #8


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


madmasles,
Цитата:
Путь к файлу Scenery.CFG и его имя постоянны или нет?
Постоянный путь и постоянное имя файла.

Цитата:
Title=Ibiza X Ground связаны или нет с Local=Aerosoft\Ibiza X Ground?
Не связаны. Просто так совпало на примере, сорри.

Нужно в функцию передать Title= (например 'Island of Ibiza') и передать путь к сценарию Local= (например 'Aerosoft\Ibiza X Ground')

----------------------------------------------------------------------------------------------------
функция, скорее всего, будет вызываться несколько раз последовательно (будут добавляться несколько разных итоговых секций за один запуск главного скрипта)

Отправлено: 16:00, 03-12-2010 | #9


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


twister777,
Если я все правильно понял, то сейчас функция должна работать как надо. Я код в своем посте поправил. Можно еще с окном типа
Код: Выделить весь код
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt('TrayMenuMode', 1)

$sFile = @ScriptDir & '\Scenery.CFG'

#region ### START Koda GUI section ### Form=
$hGui = GUICreate('Редактор Scenery.CFG', 300, 205, -1, -1)
GUICtrlCreateLabel('Введите Title', 10, 5, 280, 17, $SS_CENTER)
GUICtrlCreateLabel('Введите Local', 10, 50, 280, 17, $SS_CENTER)
GUICtrlCreateLabel('Путь к файлу Scenery.CFG', 10, 95, 280, 17, $SS_CENTER)
$LabelResult = GUICtrlCreateLabel('', 0, 185, 300, 20)
$InputTitle = GUICtrlCreateInput('', 10, 25, 280, 20)
$InputLocal = GUICtrlCreateInput('', 10, 70, 280, 20)
$InputCFG = GUICtrlCreateInput($sFile, 10, 115, 280, 20)
$ButtonGo = GUICtrlCreateButton('Редактировать', 40, 145, 90, 30)
$ButtonOpen = GUICtrlCreateButton('Открыть', 170, 145, 90, 30)

GUISetState()
#endregion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $ButtonOpen
            $sFile = GUICtrlRead($InputCFG)
            If FileExists($sFile) Then
                Run('NotePad ' & $sFile)
            Else
                GUICtrlSetData($LabelResult, 'ERROR: Файл не найден.')
            EndIf
        Case $ButtonGo
            $sTitleNew = GUICtrlRead($InputTitle)
            $sLocalNew = GUICtrlRead($InputLocal)
            $sFile = GUICtrlRead($InputCFG)
            If Not $sTitleNew Or Not $sLocalNew Or Not $sFile Then
                GUICtrlSetData($LabelResult, 'Вы ввели не все данные.')
            Else
                $sRes = _AddNewSection($sLocalNew, $sTitleNew, $sFile)
                If Not @error Then
                    GUICtrlSetData($LabelResult, 'OK: Новая секция: [Area.' & @extended & ']' _
                             & 'с новым Layer: ' & $sRes)
                    GUICtrlSetData($InputTitle, '')
                    GUICtrlSetData($InputLocal, '')
                Else
                    GUICtrlSetData($LabelResult, 'ERROR: Произошла ошибка редактирования.')
                EndIf
            EndIf
    EndSwitch
WEnd

;тут функцию _AddNewSection($sLocal, $sTitle, $sFileCFG) добавить.

Отправлено: 18:47, 03-12-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Функция для добавления текста в файл с учётом нумерации, на примере Scenery.cfg

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
OpenOffice Writer, Проблемы с выводом нумерации страниц. steppe Программное обеспечение Linux и FreeBSD 1 03-04-2013 13:18
2003/XP/2000 - [решено] сбилась функция автоматического удаления выделенного текста клавишей BackSpace myohoji Microsoft Office (Word, Excel, Outlook и т.д.) 3 19-11-2012 18:57
добавления строк в файл e9990638 Автоматическая установка приложений 5 18-01-2007 18:35
Расширение памяти DOS / config.cfg excimer1 Автоматическая установка Windows 2000/XP/2003 2 12-08-2005 15:46




 
Переход