Что нового

[Данные, строки] Копирование настроек из файла шаблона в рабочий файл

rout

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

Описание: Доброго времени суток, уважаемые. Вопрос таков: есть два текстовых файла. Первый "рабочий" файл постоянно дописывается. Он приходит с обновлением, и от этого настройки в нем - дефолтные. Среди них, существуют те настройки, которые нужно заменить на персонализированные по готовому шаблону. К слову сказать в рабочем файле около 3к записей, а в файле шаблона около 2к.
Так вот, нужно найти в рабочем файле значение 'option1' найти и сверить его с шаблоном, не совпало - взять из шаблона. Далее 'option2' в шаблоне такого нет - идем дальше.
Прошу вашей помощи.
Спасибо.

Примечания:
Пример "рабочего" файла:
Код:
#name
$conf['option1'] = 'dset1';
$conf['option2'] = 'dset2';
$conf['option3'] = 'dset3';
$conf['option4'] = 'dset4';
#name2
   'option5' => 'dset5',
   'option6' => 'dset6',
   'option7' => 'dset7',
   'option8' => 'dset8',
   'option9' => 'dset9',
   'option10' => 'dset10',
   'option11' => 'dset11',
   'option12' => 'dset12',

Пример шаблона файла:
Код:
#name
$conf['option1'] = 'set1';
$conf['option4'] = 'set4';
#name2
   'option5' => 'set5',
   'option6' => 'set6',
   'option9' => 'set9',
   'option10' => 'set10',
   'option12' => 'set12',
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
rout

Что значит "взять из шаблона"? Нужно заменять в рабочем файле?
Код:
#include <Array.au3>

Dim $aR, $aH

$sR = FileRead('r.txt')
$aR = StringRegExp($sR, "'(.*?)'", 3)
$sH = FileRead('h.txt')
$aH = StringRegExp($sH, "'(.*?)'", 3)


For $i = 0 To UBound($aR) - 1 Step 2
	$iSearch = _ArraySearch($aH, $aR[$i])
	If $iSearch <> -1 And $aR[$i + 1] <> $aH[$iSearch + 1] Then $sR = StringReplace($sR, "'" & $aR[$i + 1] & "'", "'" & $aH[$iSearch + 1] & "'")	
Next

$hFile = FileOpen('r.txt', 2)
FileWrite($hFile, $sR)
FileClose($hFile)
 
Автор
R

rout

Новичок
Сообщения
11
Репутация
0
WSWR, приветствую!
Спасибо за труд, к сожалению сейчас немогу проверить работоспособность скрипта. Но хотя бы поясню в виде алгоритма что означает "взять из шаблона":
1. берем рабочий файл
2. находим в нем опцию №1 и соответствующее ей значение №1
3. смотрим в файле шаблона опцию №1 со значением №1
4. если в рабочем файле значение не совпадает с файлом шаблона - копируем в рабочий файл из шаблона это значение ("взять из шаблона")
5. продолжаем с остальными

Извините, если немогу достаточно доходчиво пояснить.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
rout
В принципе, скрипт примерно так и работает
Только, возможно, при больших файлах будет работать недостаточно быстро
 
Автор
R

rout

Новичок
Сообщения
11
Репутация
0
WSWR,
Работает отлично, огромное спасибо, да - долго, но скорость его работы неважна абсолютно.
Единственное есть один нюанс, в конструкции: $conf['option1'] = 'dset1';
скрипт берет из шаблона 'set1' и заменяет 'option1' то же, т.е. получается так:

было: $conf['option1'] = 'dset1';
стало: $conf['set1'] = 'set1';

файлы не одинаковы по строкам и такое ощущение что скрипт "съезжает"
где и что нужно добавить?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
rout

На данных из первого поста я такое не наблюдаю, и вроде логических ошибок нет

Возможно, в реальных файлах что-то не так, и скрипт сбивается
С помощью
Код:
_ArrayDisplay($aR)
_ArrayDisplay($aH)

нужно посмотреть, какой в массивах порядок следования имен настроек и самих настроек.
Должно быть
Код:
option1
dset1
option2
dset2
option10
dset10
...
в обоих массивах, т.е. настройка всегда идет после имени и т.д.

а ускорить можно, если цикл сравнения пускать по наименьшему массиву, у меня вообще-то наоборот)
 
Автор
R

rout

Новичок
Сообщения
11
Репутация
0
WSWR,
К сожалению снова немогу проверить работоспособность сразу, получится сделать это где то через пару часов. Однако отмечу, если это как то пригодится, что в конструкции $conf['option1'] = 'dset1'; изменятся должен только 'dset1', имена настроек статичны и просто сравниваются друг с другом на совпадение.
В любом случае огромное спасибо за Вашу помощь.


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

WSWR,
Посмотрел, в файле около 4к записей, сбивается я та понял в нескольких местах, так что отловить это - трата времени. А можно ли реализовать такой механизм?:

1. открываем файл шаблон
2. находим первую строку ($conf['option1'] = 'dset1')
3. в ней находим имя настройки в квадратных скобках - забираем (['option1'])
4. открываем рабочий файл
5. ищем это имя. если находим - подставляем значение ('set1' вместо 'dset1'). если нет - ищем следующее.

Спасибо.
 
Верх