Подскажите, как можно решить проблему, а то я в не-игровом скриптинге еще не шарю..
Причем это надо сделать в паре тысяч строк...
Posted: Thu Feb 03, 2011 5:58 pm
by VladSh
Алгоритм-1 (простой):
Проходим по строкам в цикле; дальше действия для одной строки:
- разбиваем строку в массив, через символ кавычки (");
- берём только чётные значения (это всё, что находится внутри кавычек);
- проходим в цикле по полученному массиву и выбираем те значения, которые могут быть числовыми.
Алгоритм-2 (вытягиваем определённые значения):
Проходим по строкам в цикле; дальше действия для одной строки:
- первый подпункт из пред. варианта;
- берём в цикле нечётное, убираем (replace) из него символы < = и пробел, проверяем, содержится ли оно в заранее сформированном списке наименований (model, posX,...), если да, то берём его чётное (т.е. +1) значение массива.
P.S. Также можно взять за пример разбор ini-файлов или аргументов (из скриптов Infocatcher'а).
И в инете наверняка можно найти пример вытягивания данных их атрибутов XML.
Posted: Thu Feb 03, 2011 6:15 pm
by Infernal
К сожалению, пока не понял...
Тем-более, с vb и js я в корнях не дружу.. Примерный код набросать сможешь?
Posted: Thu Feb 03, 2011 6:54 pm
by VladSh
Блин, а я так домой хотел!..
Для одной строки написал:
var structAttr =
{
model: 1,
posX: 1,
posY: 1,
rotX: 1,
rotY: 1,
rotZ: 1
};
var sXML = "";
var aRES;
// < цикл по строкам открывается
//получаем строку
sXML = '<vehicle id="vehicle (FBI Truck) (1)" paintjob="3" model="528" plate="8AX6XNH" interior="0" dimension="0" posX="130.36889648438" posY="1860.7575683594" posZ="17.936124801636" rotX="0" rotY="0" rotZ="90" upgrades="1096,1087,1008" />';
aRES = getAttributesValues(sXML);
if (aRES != null)
WScript.Echo(aRES.join(", ")); //решаем, куда результат выплёвывать
// цикл по строкам закрывается >
function getAttributesValues(sXML)
{
var aXML = sXML.split('"');
var sATTR = "";
var aRES = [];
var r = 0;
for (var n = 0; n <= aXML.length; n++)
{
sATTR = aXML[n].replace(/ /g, "");
sATTR = sATTR.replace(/=/g, "");
sATTR = sATTR.replace(/</g, "");
if (structAttr[sATTR] == 1)
{
aRES[r] = aXML[n + 1];
r += 1;
}
n += 1;
}
if (r > 0) return aRES
}
к сожалению, как формировать structAttr динамически я не знаю а это очень бы пригодилось...
P.S. И ещё жаль, что ЭТА ШТУКА под AkelPad не пашет (((
Posted: Fri Feb 04, 2011 9:10 am
by Fr0sT
Экспорт в Эксель из XML
Posted: Fri Feb 04, 2011 11:31 am
by Infernal
Один минус. Это не XML, а обычный текстовый документ.
Posted: Fri Feb 04, 2011 11:41 am
by VladSh
Infernal
Скрипт же уже набросал, в чём проблема?
Posted: Fri Feb 04, 2011 11:44 am
by Infernal
VladSh
Ты набросал скрипт для заданной строки. Уже, вбитой, по идее)). А я пытаюсь массово и быстро Мне попросту не фкайф вбивать 1к строк вручную.
Posted: Fri Feb 04, 2011 1:35 pm
by VladSh
Ну ты, блин, даёшь!..
И что, вбивать по одной строке быстрее, чем сделать поиск по форуму?? Может лучше бы потратить это время и разобраться?
Копируем себе скрипт ProcessRowText.js.
Раскоменчиваем кусок внизу (убираем /* и */).
Создаём в той же дирректории новый js-файл, на основе того, что я вверху писал, допустим MySuperPuperMegaScript.js.
Удаляем функцию processString из ProcessRowText.js.
Несколько преобразований и получаем:
//задаём начальные тэги
var structAttr =
{
model: 1,
posX: 1,
posY: 1,
rotX: 1,
rotY: 1,
rotZ: 1
};
//подключаем ProcessRowText.js
eval(AkelPad.ReadFile(AkelPad.GetAkelDir(5) + "\\ProcessRowText.js"));
//берём весь текст
var pSelText = AkelPad.GetTextRange(0, -1);
//вызываем основную функцию обработчика всего файла
var arrResult = processRowText(pSelText);
AkelPad.SetSel(0, -1); //выделяем весь текст
AkelPad.ReplaceSel(arrResult.join("\r")); //заменяем на результат
//функция обработки отдельной строки
function processString(rowXML)
{
var pResult = "";
var aRES = getAttributesValues(rowXML);
if (aRES != null)
pResult = aRES.join(", ");
return pResult
}
//сюда вставить функцию getAttributesValues из моего прошлого скрипта этой темы
Всё просто, как двери!
Posted: Fri Feb 04, 2011 1:45 pm
by Infernal
Имхо, просто не как двери)) На твоем скрипте он останавливает на 13 строчке (где команда eval), и почему-то требует точку_с_запятой (точнее говоря, ПРЕДПОЛОГАЕТСЯ ";"). Но в скрипте все проставлено, т.к я скопировал твой скрипт ну и пр.
Posted: Fri Feb 04, 2011 1:49 pm
by Fr0sT
Один минус. Это не XML, а обычный текстовый документ.
То, что ты привёл - это формат XML. Даже если там нету заголовков и корневого узла, добавить их - пять секунд.
P.S. Кстати, сейчас потестил с примером Fr0sT'а - всё работает.
Posted: Fri Feb 04, 2011 1:53 pm
by Infernal
вот наконец человек знающий появился))) спасиба)) дальше уже сам попробую разобраться))
Я тоже попробовал Fr0sT'овым примером - тоже работает. А твой фаил я скопировал по твоей инструкции, и ничего((
Главное осталось одно - удалить ненужные строки и все)
Тему можно закрывать. Frost'у отдельная благодарность.
Posted: Fri Feb 04, 2011 2:15 pm
by VladSh
Infernal
Ну ничего, так ничего, что ж тут поделаешь...