AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Скрипт для кодинга
Goto page 1, 2  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian)
View previous topic :: View next topic  
Author Message
Infernal



Joined: 03 Feb 2011
Posts: 7

PostPosted: Thu Feb 03, 2011 5:41 pm    Post subject: Скрипт для кодинга Reply with quote

Кто может написать скрипт вырезания лишних строк? Мне дана строка:
Code:
<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:
528, 130.36889648438,  1860.7575683594, 17.936124801636, 90,0,0

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

Причем это надо сделать в паре тысяч строк...
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Thu Feb 03, 2011 5:58 pm    Post subject: Reply with quote

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

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

P.S. Также можно взять за пример разбор ini-файлов или аргументов (из скриптов Infocatcher'а).
И в инете наверняка можно найти пример вытягивания данных их атрибутов XML.
Back to top
View user's profile Send private message Visit poster's website
Infernal



Joined: 03 Feb 2011
Posts: 7

PostPosted: Thu Feb 03, 2011 6:15 pm    Post subject: Reply with quote

К сожалению, пока не понял...
Тем-более, с vb и js я в корнях не дружу.. Примерный код набросать сможешь?
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Thu Feb 03, 2011 6:54 pm    Post subject: Reply with quote

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

test.js

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

P.S. И ещё жаль, что ЭТА ШТУКА под AkelPad не пашет (((
Back to top
View user's profile Send private message Visit poster's website
Fr0sT



Joined: 24 Jul 2007
Posts: 875

PostPosted: Fri Feb 04, 2011 9:10 am    Post subject: Reply with quote

Экспорт в Эксель из XML
Back to top
View user's profile Send private message
Infernal



Joined: 03 Feb 2011
Posts: 7

PostPosted: Fri Feb 04, 2011 11:31 am    Post subject: Reply with quote

Один минус. Это не XML, а обычный текстовый документ.
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Feb 04, 2011 11:41 am    Post subject: Reply with quote

Infernal
Скрипт же уже набросал, в чём проблема?
Back to top
View user's profile Send private message Visit poster's website
Infernal



Joined: 03 Feb 2011
Posts: 7

PostPosted: Fri Feb 04, 2011 11:44 am    Post subject: Reply with quote

VladSh
Ты набросал скрипт для заданной строки. Уже, вбитой, по идее)). А я пытаюсь массово и быстро Wink Мне попросту не фкайф вбивать 1к строк вручную.
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Feb 04, 2011 1:35 pm    Post subject: Reply with quote

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

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

MySuperPuperMegaScript.js

Code:
//задаём начальные тэги
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 Evil
Back to top
View user's profile Send private message Visit poster's website
Infernal



Joined: 03 Feb 2011
Posts: 7

PostPosted: Fri Feb 04, 2011 1:45 pm    Post subject: Reply with quote

Имхо, просто не как двери)) На твоем скрипте он останавливает на 13 строчке (где команда eval), и почему-то требует точку_с_запятой (точнее говоря, ПРЕДПОЛОГАЕТСЯ ";"). Но в скрипте все проставлено, т.к я скопировал твой скрипт ну и пр.
Back to top
View user's profile Send private message
Fr0sT



Joined: 24 Jul 2007
Posts: 875

PostPosted: Fri Feb 04, 2011 1:49 pm    Post subject: Reply with quote

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

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


Code:
<?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>
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Feb 04, 2011 1:51 pm    Post subject: Reply with quote

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
Back to top
View user's profile Send private message Visit poster's website
Infernal



Joined: 03 Feb 2011
Posts: 7

PostPosted: Fri Feb 04, 2011 1:53 pm    Post subject: Reply with quote

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

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

Тему можно закрывать. Frost'у отдельная благодарность.
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Fri Feb 04, 2011 2:15 pm    Post subject: Reply with quote

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


Коллеги,
вопрос по ходу: как можно массив
Code:
var arrAttr = ["model", "posX", "posY", "rotX", "rotY", "rotZ"];
программно преобразовать в структуру такого вида:
Code:
var structAttr =
{
   model: 1,
   posX: 1,
   posY: 1,
   rotX: 1,
   rotY: 1,
   rotZ: 1
};
Есть ли какие-нибудь красивые способы (кроме eval'а)?
Back to top
View user's profile Send private message Visit poster's website
Infocatcher



Joined: 06 Aug 2007
Posts: 1554

PostPosted: Fri Feb 04, 2011 2:39 pm    Post subject: Reply with quote

VladSh wrote:
Есть ли какие-нибудь красивые способы (кроме eval'а)?
Эээ... а eval тут каким боком поможет?
Code:
var arrAttr = ["model", "posX", "posY", "rotX", "rotY", "rotZ"];
var structAttr = {};
for(var i = 0, l = arrAttr.length; i < l; i++)
   structAttr[arrAttr[i]] = 1;
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group