|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Функция для добавления текста в файл с учётом нумерации, на примере Scenery.cfg |
|
|
[решено] Функция для добавления текста в файл с учётом нумерации, на примере Scenery.cfg
|
Новый участник Сообщения: 8 |
Профиль | Отправить 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 Функция сама находит максимальное значение числа в строчках 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 |
Пользователь Сообщения: 88
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать Я не очень разбираюсь в синтаксисе AutoIt...
А где здесь переменная в которую задавать Title=Ibiza X Ground Local=Aerosoft\Ibiza X Ground и их вывод в результирующий файл. и где вывод вот таких строчек Active=TRUE Required=FALSE ? |
Отправлено: 13:31, 03-12-2010 | #3 |
Ветеран Сообщения: 812
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Пользователь Сообщения: 88
|
Профиль | Отправить PM | Цитировать Цитата twister777:
#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
|
Профиль | Отправить PM | Цитировать gregaz,
Строчка вывода 2 и 3 должна где-то задаваться - там прописываются пути и названия, они разные, в этом смысл автоматизации. http://forum.oszone.net/post-1557491-5.html Вам тоже спасибо за вариант решения. После 20.00 МСК попробую оба варианта дома на практике. |
Отправлено: 15:12, 03-12-2010 | #7 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать Цитата twister777:
Цитата twister777:
Цитата twister777:
Title=Ibiza X Ground связаны или нет с Local=Aerosoft\Ibiza X Ground? Путь к файлу Scenery.CFG и его имя постоянны или нет? |
|||
Отправлено: 15:25, 03-12-2010 | #8 |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать madmasles,
Цитата:
Цитата:
Нужно в функцию передать Title= (например 'Island of Ibiza') и передать путь к сценарию Local= (например 'Aerosoft\Ibiza X Ground') ---------------------------------------------------------------------------------------------------- функция, скорее всего, будет вызываться несколько раз последовательно (будут добавляться несколько разных итоговых секций за один запуск главного скрипта) |
||
Отправлено: 16:00, 03-12-2010 | #9 |
Ветеран Сообщения: 812
|
Профиль | Отправить 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 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|