Что нового

Сортировка секций INI файла

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Здравствуйте, уже час ломаю голову, делаю наброски - но никак не получается :wacko:
Проблема такая: имеется INI файл с следующим содержимом:
Код:
[0]
All=4

[1]
Name="MsgboxWizard"

[2]
Name="cmd"

[3]
Name="pltsk"

[4]
Name="s4"

Где, секция "0", ключ "All" содержит информацию о том, сколько еще секций в файле.
Секции идут по порядку, их количество может меняться как в +, так и в -.

В общем, скрипт читает этот файл так (и строит список иконок с сортировкой, как нумерация секций):
Код:
Local $All, $Read
$All= IniRead ( "File.ini", "0", "All", "0" )
If $All > 0 Then
    For $i = 1 To $All
    $Read= IniRead ( "File.ini", $i, "Name", "" )
    ...
    Next
EndIF


Проблема в том, чтобы, к примеру, переименовать секции таким образом:
1 в _1
2 в _2
3 в _3
4 в _4
_3 в 1 (это задает пользователь)
_1 в 2
_2 в 3
_4 в 4

Но это все еще при условии, что может быть и по другому:
1 в _1
2 в _2
3 в _3
4 в _4

_4 в 4
_3 в 2
_2 в 1
_1 в 3 (это задает пользователь)


Пользователь, например может как 10 иконку поставить на место 13 (бывшая 13 станет 12 и т. д...), так и 15 на 3...

Это полный завал, мозги кипят, очень надеюсь на Вашу помощь :(
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
1 секция наверное ни к чему
Код:
IniReadSectionNames
возвращает массив где 0-ой индекс имеет кол-во всех секций.

Условие какого то рандома, может быть каких нибудь использовать только 2-3 алгоритма перестановок? Обязательно ли такое
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Я пробовал для переименования
Код:
IniRenameSection


Условие какого то рандома, может быть каких нибудь использовать только 2-3 алгоритма перестановок? Обязательно ли такое
Извиняюсь, но я не совсем понял вопрос...
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Astel064
_IniVirtual - прочитай INI-файл в массив, сортируй, переименовывай как заблагорассудится, сохраняешь итог назад в файл.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Код:
IniVirtual

Не думаю, что этот вариант решит мои проблемы... Я не могу создать алгоритмы, по которым он будет переименовывать (сортировать)...

Я переименовывал пытался переименовывать с помощью цикла
Код:
For ... Next
и функции
Код:
IniRenameSection
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Astel064 [?]
Не думаю, что этот вариант решит мои проблемы
Вы не над тем думаете ;D
Вам AZJIO подсказал один из вариантов вашей "проблемы"!
Просто нужно понять, что все преобразования лучше сделать в памяти, а результат записать в файл.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
О, я сразу ошибку в описании _IniVirtual_Initial нашёл. Короче, эта функция и текстового представления ini-файла создаёт двумерный массив. В первой колонке имена секций, во второй параметры. Итак, сортировка массива - _ArraySort (по первой колонке), переименование - присвоить ячейки в первой колонке имя. Вот и все алгоритмы.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Вам AZJIO подсказал один из вариантов вашей "проблемы"!
Просто нужно понять, что все преобразования лучше сделать в памяти, а результат записать в файл.
Спасибо, теперь дошло :smile:


Итак, сортировка массива - _ArraySort (по первой колонке), переименование - присвоить ячейки в первой колонке имя. Вот и все алгоритмы.
Пожалуйста, можно (хотя-бы простенький, схожий с моей ситуацией) пример того, как это будет выглядеть? ???
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Если я правильно понял, нужно взять какую либо из секций и переставить ее на другое место так, что бы остальные секции сдвинулись соответственно вверх или вниз файла, в зависимости от того в какую сторону перемещается нужная секция...

Вот что у меня получилось:
Код:
#include <Array.au3>

;Читаем ini-файл в массив $aSectionContents, содержащий массивы с содержимым секций ini-файла :)))
$sIniFile = @ScriptDir & '\file.ini'
$aSectionNames = IniReadSectionNames($sIniFile)
Dim $aSectionContents[1]
For $i = 1 To $aSectionNames[0]
	_ArrayAdd($aSectionContents, IniReadSection($sIniFile, $aSectionNames[$i]))
Next

$iOldNumber = 4 ;Позиция(имя) перемещаемой секции
$iNewNumber = 2 ;Позиция(имя), на которую перемещается секция

If $iNewNumber > $iOldNumber Then
	_ArrayInsert($aSectionContents, $iNewNumber + 1, $aSectionContents[$iOldNumber]) ;Копируем секцию в нужную позицию
	_ArrayDelete($aSectionContents, $iOldNumber)                                     ;Удаляем скопированную секцию со старой позиции
ElseIf $iNewNumber < $iOldNumber Then
	_ArrayInsert($aSectionContents, $iNewNumber    , $aSectionContents[$iOldNumber])  ;Копируем секцию в нужную позицию
	_ArrayDelete($aSectionContents, $iOldNumber + 1)                                  ;Удаляем скопированную секцию со старой позиции
EndIf

;Сохраняем ini
FileDelete($sIniFile)
For $i = 1 To UBound($aSectionContents) - 1
	IniWriteSection($sIniFile, $i, $aSectionContents[$i])
Next


P.S. Если я понял неправильно, напишите, я удалю это сообщение))
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Astel064 сказал(а):
Извиняюсь, но я не совсем понял вопрос...
Я говорил про то что обязательно ли менять ячейки именно так как "вздумается" пользователю. Может быть для пользователя предоставить только несколько вариантов перестановок минимально 2-3. Например в скрипте есть 2 алгоритма, пользователь выберет(м.б. в InputBox) номер алгоритма и скрипт выполнит перестановку по которой требуется.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
P.S. Если я понял неправильно, напишите, я удалю это сообщение))
Вы все правильно поняли, это то что нужно! :laugh: Большое спасибо Вам, что помогли)))
Всем спасибо за внимание к моей теме :smile:


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

По примеру aleratorio создал записал его пример (почти без изменений) так сказать в UDF на случай, если кому еще понадобится :bye:
См. прикрепления :smile:
 
Верх