Скрипт для кодинга

Russian main discussion
  • Author
  • Message
Offline
Posts: 7
Joined: Thu Feb 03, 2011 5:35 pm

Скрипт для кодинга

Post by Infernal »

Кто может написать скрипт вырезания лишних строк? Мне дана строка:

Code: Select all

<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" />
А её надо превратить (попросту выдрать значения model, posX, posY, posZ, rotZ) в:

Code: Select all

528, 130.36889648438,  1860.7575683594, 17.936124801636, 90,0,0
Подскажите, как можно решить проблему, а то я в не-игровом скриптинге еще не шарю..

Причем это надо сделать в паре тысяч строк...

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Алгоритм-1 (простой):
Проходим по строкам в цикле; дальше действия для одной строки:
- разбиваем строку в массив, через символ кавычки (");
- берём только чётные значения (это всё, что находится внутри кавычек);
- проходим в цикле по полученному массиву и выбираем те значения, которые могут быть числовыми.

Алгоритм-2 (вытягиваем определённые значения):
Проходим по строкам в цикле; дальше действия для одной строки:
- первый подпункт из пред. варианта;
- берём в цикле нечётное, убираем (replace) из него символы < = и пробел, проверяем, содержится ли оно в заранее сформированном списке наименований (model, posX,...), если да, то берём его чётное (т.е. +1) значение массива.

P.S. Также можно взять за пример разбор ini-файлов или аргументов (из скриптов Infocatcher'а).
И в инете наверняка можно найти пример вытягивания данных их атрибутов XML.

Offline
Posts: 7
Joined: Thu Feb 03, 2011 5:35 pm

Post by Infernal »

К сожалению, пока не понял...
Тем-более, с vb и js я в корнях не дружу.. Примерный код набросать сможешь?

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Блин, а я так домой хотел!.. :twisted:
Для одной строки написал:

Code: Select all

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 динамически я не знаю :cry: а это очень бы пригодилось...

P.S. И ещё жаль, что ЭТА ШТУКА под AkelPad не пашет (((

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Экспорт в Эксель из XML

Offline
Posts: 7
Joined: Thu Feb 03, 2011 5:35 pm

Post by Infernal »

Один минус. Это не XML, а обычный текстовый документ.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infernal
Скрипт же уже набросал, в чём проблема?

Offline
Posts: 7
Joined: Thu Feb 03, 2011 5:35 pm

Post by Infernal »

VladSh
Ты набросал скрипт для заданной строки. Уже, вбитой, по идее)). А я пытаюсь массово и быстро ;) Мне попросту не фкайф вбивать 1к строк вручную.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Ну ты, блин, даёшь!.. :shock:
И что, вбивать по одной строке быстрее, чем сделать поиск по форуму?? Может лучше бы потратить это время и разобраться? :)

Копируем себе скрипт ProcessRowText.js.
Раскоменчиваем кусок внизу (убираем /* и */).
Создаём в той же дирректории новый js-файл, на основе того, что я вверху писал, допустим MySuperPuperMegaScript.js.
Удаляем функцию processString из ProcessRowText.js.
Несколько преобразований и получаем:

Code: Select all

//задаём начальные тэги
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 из моего прошлого скрипта этой темы
Всё просто, как двери! :twisted:

Offline
Posts: 7
Joined: Thu Feb 03, 2011 5:35 pm

Post by Infernal »

Имхо, просто не как двери)) На твоем скрипте он останавливает на 13 строчке (где команда eval), и почему-то требует точку_с_запятой (точнее говоря, ПРЕДПОЛОГАЕТСЯ ";"). Но в скрипте все проставлено, т.к я скопировал твой скрипт ну и пр.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Один минус. Это не XML, а обычный текстовый документ.
То, что ты привёл - это формат XML. Даже если там нету заголовков и корневого узла, добавить их - пять секунд.
Image

Code: Select all

<?xml version="1.0" encoding="UTF-8"?> 
<root>
<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" />
<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" />
<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" />	
</root>

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infernal wrote:...На твоем скрипте он останавливает на 13 строчке (где команда eval)...
VladSh wrote:...Копируем себе скрипт ProcessRowText.js...
P.S. Кстати, сейчас потестил с примером Fr0sT'а - всё работает.
Last edited by VladSh on Fri Feb 04, 2011 1:53 pm, edited 1 time in total.

Offline
Posts: 7
Joined: Thu Feb 03, 2011 5:35 pm

Post by Infernal »

вот наконец человек знающий появился))) спасиба)) дальше уже сам попробую разобраться))
Я тоже попробовал Fr0sT'овым примером - тоже работает. А твой фаил я скопировал по твоей инструкции, и ничего((

Главное осталось одно - удалить ненужные строки и все)

Тему можно закрывать. Frost'у отдельная благодарность.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infernal
Ну ничего, так ничего, что ж тут поделаешь...


Коллеги,
вопрос по ходу: как можно массив

Code: Select all

var arrAttr = ["model", "posX", "posY", "rotX", "rotY", "rotZ"];
программно преобразовать в структуру такого вида:

Code: Select all

var structAttr = 
{ 
   model: 1, 
   posX: 1, 
   posY: 1, 
   rotX: 1, 
   rotY: 1, 
   rotZ: 1 
};
Есть ли какие-нибудь красивые способы (кроме eval'а)?

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh wrote:Есть ли какие-нибудь красивые способы (кроме eval'а)?
Эээ... а eval тут каким боком поможет?

Code: Select all

var arrAttr = ["model", "posX", "posY", "rotX", "rotY", "rotZ"];
var structAttr = {};
for(var i = 0, l = arrAttr.length; i < l; i++)
	structAttr[arrAttr[i]] = 1;
Post Reply