Парс и все что с ним связано

*Immortal Pony*

Заблокирован
Заблокирован
Победитель в номинации 2019
Победитель в номинации 2018
Победитель в номинации 2016
Победитель в номинации 2015
Сообщения
1 680
Розыгрыши
0
Репутация
1 222
Реакции
801
Баллы
1 283
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Доброго времени суток.

Ищу "гуру" что поможет\научит (покажет) что есть парсинг, с чем его едят и как его делать с клиент файлов л2, разных BD по л2.

Или же ткнет (даст совет\ссылочку) для начинающего нубаса в этом деле.



Премного благодарен что прочли сей топик!
 
Последнее редактирование:
Нужно всего лишь достать из файла строку, а затем проанализировать ее и вытянуть нужные тебе данные.
Попробуй вручную распарсить Json, например, и поймешь всю суть.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
если данные строго типизированы (аля датки линейджа по табуляциям, ну в ХФе так) - то самый простой вариант это все, что находится в java.lang.String.
более продвинутый уровень это пакет java.util.regex (тут конечно тяжелее всё будет, но и возможности огромные)
открывайте пакеты, смотрите методы, гуглите инфу, её к счастью просто миллионы.

для обработки популярных форматов (xml, json) существуют миллионы библиотек, так что не нужно выдумывать велосипед.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Не типизированы, могу любой вид столбцу (началу) задать, а вот для остального "скилла" не хватает (не занимался этим вовсе)....
Пощупаю все советы, благодарю.
 
Не типизированы, могу любой вид столбцу (началу) задать, а вот для остального "скилла" не хватает (не занимался этим вовсе)....
Пощупаю все советы, благодарю.
Самый простой вариант без использования regexp = Files.readAllLines();
Код:
for(String nextLine : Files.readAllLines()) {
       //code
}
Этим способом парсил все абилки из фф9, имея такой исходник:
каждый лайн = строка, дальше по ключевым словами этйо строки если они там есть.
 
Files.readAllLines() загружает же весь файл в память, что не очень приятно если файл очень большой, но как вариант подходит.
Для решения этой проблемы можно воспользоваться любым Reader'ом (допустим тем же BufferedReader).
Допустим конструкция такого вида
Код:
BufferedReader br = new BufferedReader(new FileReader(FILE_PATH)
String line;
while ((line = br.readLine()) != null)
//do some stuff
будет парсить по строчкам, работать будет медленнее, но памяти много не нужно.
 
Не совсем понятно что ты хочешь и что парсить и какой результат получчить.
Если с датников клиента типо так upload_2018-8-23_22-58-13.png upload_2018-8-23_22-59-49.png то ищи я делал прогу под ил парсит датники в SQL и обратно.
Если с сайта, то ты уточни для начала, на каком языке хочешь парсить, сайт, и ссылку на страницу с которой ты хочешь парсить.
 
Ну вот к примеру я для своих нужд писал методы простые

этот разбирает csv/txt-файл того вида, который выдает l2disam, т.е. значения в виде таблицы с разделителями в виде табов
считывает файл и заполняет его содержимым мапу, ключами основной мапы служат значения из столбца с номером idx
а для ключей вложенной мапы служат значения столбцов из самой первой строки файла.
Код:
	public static LinkedHashMap<String, HashMap<String, String>> loadCSV(String name, boolean showLog, int idx)
	{
		LinkedHashMap<String, HashMap<String, String>> data = new LinkedHashMap<>();
		LineNumberReader lnr = null;

		try
		{
			File file = new File(name);
			lnr = new LineNumberReader(new BufferedReader(new FileReader(file)));
			String line = null;
			String[] head = null;

			if (showLog)
				_log.info("Loading file " + name + "...");

			while ((line = lnr.readLine()) != null)
			{
				if (line.trim().length() == 0)
					continue;

				line = line.trim();

				if (head == null)
				{
					head = line.split("\t");
					continue;
				}

				String[] vals = line.split("\t");

				HashMap<String, String> _data = new HashMap<>();

				for (int i = 0; i < vals.length; i++)
					_data.put(head[i], vals[i]);

				data.put(vals[idx], _data);
			}
		}
		catch (FileNotFoundException e)
		{
			_log.error("File " + name + " not found.");
		}
		catch (Exception e)
		{
			_log.error("File " + name + " loading failed.");
		}
		finally
		{
			try
			{
				if (lnr != null)
					lnr.close();
			}
			catch (Exception e1)
			{}

			if (showLog)
				_log.info("File " + name + " loaded.");
		}

		return data;
	}

или вот другой вариант - это для файлов, в которых строки выглядят как "key=value[tab]key=value ... ", т.е. формат, который к примеру выдает кодер/декодер L2ClientDat - результат работы такой же как в первом случае, т.е. мапа.
Код:
	public static LinkedHashMap<String, HashMap<String, String>> loadDAT(String name, boolean showLog, int... idx)
	{
		LinkedHashMap<String, HashMap<String, String>> data = new LinkedHashMap<>();
		LineNumberReader lnr = null;

		try
		{
			File file = new File(name);
			lnr = new LineNumberReader(new BufferedReader(new FileReader(file)));
			String line = null;

			if (showLog)
				_log.info("Loading file " + name + "...");

			while ((line = lnr.readLine()) != null)
			{
				if (line.trim().length() == 0)
					continue;

				line = line.trim();
				String[] vals = line.split("\t");

				HashMap<String, String> _data = new HashMap<>();
				String[] key = new String[idx.length];
				int kIdx = 0;
				
				for (int i = 0; i < vals.length; i++)
				{
					String[] t = vals[i].split("=");

					if (t.length < 2)
						t = new String[] { t[0], "" };

					if (ArrayUtils.contains(idx, i))
						key[kIdx++] = t[1];

					_data.put(t[0], t[1]);
				}

				data.put(Strings.join("_", key), _data);
			}
		}
		catch (FileNotFoundException e)
		{
			_log.error("File " + name + " not found.");
		}
		catch (Exception e)
		{
			_log.error("File " + name + " loading failed.", e);
		}
		finally
		{
			try
			{
				if (lnr != null)
					lnr.close();
			}
			catch (Exception e1)
			{}

			if (showLog)
				_log.info("File " + name + " loaded.");
		}

		return data;
	}
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Самый простой вариант без использования regexp = Files.readAllLines();
Код:
for(String nextLine : Files.readAllLines()) {
       //code
}
Этим способом парсил все абилки из фф9, имея такой исходник:
каждый лайн = строка, дальше по ключевым словами этйо строки если они там есть.
о ничоси final fantasy 9 , sony plastation 1 помню такую игрушечку )
А намекни что ещё кроме абилок можно спарсить , так любопытно стало.
 
о ничоси final fantasy 9 , sony plastation 1 помню такую игрушечку )
А намекни что ещё кроме абилок можно спарсить , так любопытно стало.
Вещи, монстров и всё что является статическими данными. С монстрами посложнее будет, надо использовать html библы чтобы норм спарсить.
 
Чесн говоря, не понятно на что розчитывал тс задавая вопрос аля "как запустить сирвир" или "почему не работает, я же сделал по гайду". Все файлы/сайты парсятся почти одинаково, берешь понравившийся тебе язык программирования, пишешь в гугле "парсер на ...(твой язык)", пытаешся понять что к чему, пытаешся спарсить что тебе нужно, что то не получается - задаешь вопрос.профит
 
что есть парсинг


В большинстве случаев для парсинга любой информации, включая бинарную, достаточно уметь строить ( ).
Если не умеем, то либо используем , либо ищем библиотеки для парсинга входных данных (XML, JSON, blablabla). Регулярки и библиотеки по сути своей являются обертками над уже готовыми конечными автоматами.

с клиент файлов л2
Так как они бинарные, используем связку утилит l2encdec + l2disasm для конвертации в простое представление, и потом парсим его, например как здесь.

Если имеются в виду сайты с базами знаний по л2, то достаточно использовать регулярки или библиотеку для парсинга HTML, ну и многопоточность, чтоб занять как можно больше процессора/интернет-канала (ибо они будут простаивать из-за локов IO при получения данных со страниц сайта, например). Также, в редких случаях (редких в сфере л2) возможно понадобится купить/найти пачку прокси и научится эмулировать браузер, обходить капчу и еще чего хуже, если база знаний защищена. Все это достаточно тривиально при наличии желания либо денег.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Почитал советы\предложения и немного внесу ясности.

А: чего я не указал выше: Я в этом вовсе деревянный (не понимаю как работает JSON, blablabla, регулярки не всегда выручают)

Парс с БД таких как по хроникам Классик, а точнее Древо умений, дроп (остальная инфа есть в клиенте, не густо - но хватает)

Декрипт .dat файлов идет через Dat Editor
Хотел упростить себе работу - но не вышло (из-за не хватки знаний *Как это работает*)

Б: Так как всегда работал с дп в стиле *Hand-made*, не буду изменять принципу.
 
Назад
Сверху Снизу