Author Topic: работа с текстом  (Read 8656 times)

0 Members and 1 Guest are viewing this topic.

Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: работа с текстом
« Reply #15 on: June 15, 2018, 06:41:16 PM »
на PHP эта задача кстати решалась бы довольно просто.

Не могу сказать, что в кликерманне эта задачка вызывает особые проблемы. По крайней мере для всех, кто помнит, как хранятся результаты поиска в SCANPICTURE.
Правда, если будет больше параметров и не во всех случаях укажут все значения, то пихать всё в один массив - тот еще мазохизм (особенно для не очень внимательных людей или тех, кто вынужден разбираться в чужом коде). Так что идею беру на заметку))

Quote from: Oraven
$str = ""
FOR($i=0,$i<ARRSIZE($arr1))
   //   LOGWRITE ($arr1[$i], " - ", $arr3[$i])
   $str = STRCONCAT($str,$arr1[$i], " - ", $arr3[$i],char(13),char(10))
END_CYC
$dialog = DIALOGBOX($str, 0, 0)
Так вот это как делается) Ну я догадывалась о том, что возможно несколько строк писать. Oraven, спасибо, буду пользоваться.
 Ну и реализация через буфер и параллельные массивы интересна.
у меня есть список в блокноте в котором около 10-20 различных наименований повторяющихся много раз
список весьма длинный там около 100 различных названий повторяющихся около 1000 раз

Такс, попробую помочь, пока вариантов наименований не стало около 10 тысяч, а список не расширился до миллионов))
Вы сохраняете скрипт в папку, рядом создаете блокнот с названием gamelog.txt, в него сохраняете ваши логи. Запускаете скрипт. Рядом возникнет другой блокнот - Unique names.txt с датой и результатами. Та же информация продублируется в логах.
У меня работает нормально. Если что, то как убирать случайно вклинившиеся в название хреновин кавычки ("") пока не знаю точно, так что будем считать, что их там не бывает. Вернее уже возникла мысль - не зря же МудрогоКота за напоминание про коды символов благодарю. Но что-то не очень хочется мучиться с ними.
Code: (Clickermann) [Select]
LOGCLEAR
Print("all logs: ",TFCOUNT("gamelog.txt")) //выводит в лог количество строк в блокноте
Print("")
FOR($a=0,$a<TFCOUNT("gamelog.txt"))
   $str=STRFILTER (TFREAD("gamelog.txt", $a+1), "1234567890 []-=+!№;%:?*()@#$^&{}",0) // не указанные мусорные символы можно дополнить
   For($b=0,$b<ARRSIZE ($arr),2)
      If($arr[$b]=$str)
         $arr[$b+1]= $arr[$b+1]+1
         $b=9999
      End_if
   END_CYC
   If($b<9999)
      $arr[$b]=$str
      $arr[$b+1]=1
   end_if
END_CYC

Print("***********")
Print("Unique names: ", ARRSIZE($arr)/2 )  //здесь решится загадка о количестве уникальных имен - неважно 100 их или 10
TFWRITE("Unique names.txt", "")
TFWRITE("Unique names.txt", STRCONCAT($_date_str,"  ",$_time_str)) // файл записи результатов один, но каждый подсчет подписан датой и временем

For($a=0,$a<ARRSIZE($arr),2)
   $res=STRCONCAT($a/2+1, ") ",$arr[$a]," = " ,$arr[$a+1])  // Нумерация со скобками не должна сильно помешать их переставлять в алфавитном порядке, если возникнет необходимость. Но если что сотрёшь символы [$a/2+1, ") ",], и будут просто названия
   TFWRITE("Unique names.txt", $res)
   Print($res)
End_cyc

halt
« Last Edit: June 16, 2018, 10:41:01 PM by Qwerry »

Зяба

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
Re: работа с текстом
« Reply #16 on: June 17, 2018, 07:22:31 PM »
спасибо огромное пока не вникал что к чему времени нет. но так попробовал работает все единственное во втором варианте буквы "в" тож уберает   :)

Атеист

  • Guest
Re: работа с текстом
« Reply #17 on: June 17, 2018, 07:43:03 PM »
Johnny спасибо за новые плюшки.
Oraven спасибо за то что показал как применять эти новые плюшки (красивый ввод и вывод данных, + удобство использования).

Из прошлых уроков, из сказанного в теме выше, из использования языка неочевидным образом и "побочных" эффектов такого использования, можно сделать скрипт, который будет выполняться намного быстрее.

К сожалению оригинальный лог нам так и не показали, поэтому пришлось делать воображаемый лог и для него писать скрипт. Также не известно, как получается этот лог - нажатием в приложении кнопки "Сохранить лог" сразу в файл, или через буфер обмена.

Тестировалось на Clickermann v4.13.014 x64. ОС - Windows 7 64bit
Лог сохраняем в файл "log.txt" и запускаем скрипт. На выходе получаем файл "items_count.ini". Заранее составлять список предметов, которые нужно посчитать, не требуется.
Архив для тестов во вложении.

Code: (clickermann) [Select]
$t = $_ms
LOGCLEAR
TFCLEAR("items_count.ini", 1)

TFREADARR("log.txt", $arr)
WHILE(ARRSIZE($arr))
   $str = STRFILTER(ARRPOP($arr), "IVX АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя", 1)
   INIWRITE("items_count.ini", $str, INT(INIREAD("items_count.ini", $str, "ХРЕНОВИНЫ")) + 1, "ХРЕНОВИНЫ")
END_CYC
UNDEFINE($arr)

TFREADARR("items_count.ini", $arr)
ARRSORT($arr)
TFWRITEARR("items_count.ini", $arr)

LOGWRITE ("Выполнено за ", $_ms - $t, " ms")
HALT
« Last Edit: June 18, 2018, 09:55:47 PM by Атеист »

Зяба

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
Re: работа с текстом
« Reply #18 on: June 17, 2018, 10:51:51 PM »
Johnny спасибо за новые плюшки.
Oraven спасибо за то что показал как применять эти новые плюшки (красивый ввод и вывод данных, + удобство использования).

Из прошлых уроков, из сказанного в теме выше, из использования языка неочевидным образом и "побочных" эффектов такого использования, можно сделать скрипт намного быстрее.

К сожалению оригинальный лог нам так и не показали, поэтому пришлось делать воображаемый лог и для него писать скрипт. Также не известно, как получается этот лог - нажатием в приложении кнопки "Сохранить лог" сразу в файл, или через буфер обмена.

ошибка  :(
Для Clickermann v4.13
Лог сохраняем в файл "Лог.txt" и запускаем скрипт. На выходе получаем файл "Количество хреновин.ini" (расширение можно поменять).
Архив для тестов во вложении.

Code: (clickermann) [Select]
$t = $_ms
LOGCLEAR
TFCLEAR("Количество хреновин.ini", 1)

TFREADARR("Лог.txt", $arr)

WHILE(ARRSIZE($arr))
   $str = STRFILTER(ARRPOP($arr), " АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя", 1)
   INIWRITE("Количество хреновин.ini", $str, INT(INIREAD("Количество хреновин.ini", $str, "ХРЕНОВИНЫ")) + 1, "ХРЕНОВИНЫ")
END_CYC
UNDEFINE($arr)

TFREADARR("Количество хреновин.ini", $arr)
ARRSORT($arr)
TFWRITEARR("Количество хреновин.ini", $arr)

LOGWRITE ("Выполнено за ", $_ms - $t, " ms")

HALT

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: работа с текстом
« Reply #19 on: June 17, 2018, 10:58:48 PM »
не вникал что к чему времени нет. но так попробовал работает
Так и не прокачаешь левл свой...)
Я не ду... Потому и не бу...

Атеист

  • Guest
Re: работа с текстом
« Reply #20 on: June 18, 2018, 04:56:10 PM »
...
ошибка  :(
...

Нужно больше информации по ошибке, как она проявляется. Что происходит при ошибке, что пишет Clickermann?
Я проверял скрипт на текущей релизной версии - Clickermann v4.13.014 x64. ОС - Windows 7 64bit.
Предположительно, ошибка может возникать из за большого входного файла "Лог.txt", тогда нужно сократить в этом файле количество строк.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: работа с текстом
« Reply #21 on: June 18, 2018, 05:41:39 PM »
Лог сохраняем в файл "Лог.txt" и запускаем скрипт. На выходе получаем файл "Количество хреновин.ini" (расширение можно поменять).
Во первых, сразу себе заведи привычку - забудь кириллицу и пробелы, когда дело касается наименования файла, если с этим файлом будет работать какая-либо программа, или скрипт.
Я не ду... Потому и не бу...

Атеист

  • Guest
Re: работа с текстом
« Reply #22 on: June 18, 2018, 09:42:52 PM »
Лог сохраняем в файл "Лог.txt" и запускаем скрипт. На выходе получаем файл "Количество хреновин.ini" (расширение можно поменять).
Во первых, сразу себе заведи привычку - забудь кириллицу и пробелы, когда дело касается наименования файла, если с этим файлом будет работать какая-либо программа, или скрипт.

Замечание справедливое, спасибо Евгений за поправку. Главное, помню об этом, но все равно иногда делаю. Сам от этого не страдал уже очень давно.
Свое сообщение выше переписал, файл "log.txt" сократил до 5000 строк и наполнил его новыми предметами, файлы переобозвал.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: работа с текстом
« Reply #23 on: June 19, 2018, 02:06:36 AM »
Свое сообщение выше переписал, файл "log.txt" сократил до 5000 строк
Для чего тебе такие большие файлы логов? Все скрипты, работающие более нескольких секунд, обычно построены на цикличности (не беря во внимание особые случаи). Если будет какая-то ошибка, из-за которой скрипт что-то не сделает, то эта ошибка повторится в цикличности и ища ее в логах, ты найдешь ее повторяющейся в ста, ну пусть - в двести-триста, строчках. Зачем 5 тысяч-то...?
Я не ду... Потому и не бу...

Атеист

  • Guest
Re: работа с текстом
« Reply #24 on: June 19, 2018, 10:17:17 AM »
Свое сообщение выше переписал, файл "log.txt" сократил до 5000 строк
Для чего тебе такие большие файлы логов? Все скрипты, работающие более нескольких секунд, обычно построены на цикличности (не беря во внимание особые случаи). Если будет какая-то ошибка, из-за которой скрипт что-то не сделает, то эта ошибка повторится в цикличности и ища ее в логах, ты найдешь ее повторяющейся в ста, ну пусть - в двести-триста, строчках. Зачем 5 тысяч-то...?

Сейчас за этим вопросом последует 5 тысяч+ букв в ответ. :)  Дело в том, что эти самые "логи" не есть логи работы Кликермана, в которых надо отловить ошибку, а логи из игры. Например логи крафта игровых предметов. Предполагается, что эти логи могут быть очень большими и содержать множество уникальных названий предметов на кирилице. Одна строка - один предмет + рандомный "мусор" в виде различных печатных символов и пробелов, хаотично разбросанных по строкам, но не внутри названий предметов. Это как я понял задачу.
Уникальных предметов много и в логе их названия могут повторяться в разных строках. Задача в том, чтобы посчитать сколько раз каждый предмет был записан в лог.
Такой лог и есть входные данные для скрипта, его нельзя крутить в цикле, а нужно обработать всего один раз и вывести результат.

Настоящий игровой лог я не видел, потому сделал его сам, напихав в строки "мусора" в виде - "-=+!№;%:?*()@#$^&{},0". А размер этих логов в несколько тысяч строк, как раз для того, что бы выявить преимущества/слабости разных алгоритмов. На малых объемах данных различия в работе, даже сильно отличающихся сценариев, почти не видны, нет наглядности. Кстати 5к строк это не много, но результаты тестов уже впечатляют (я приведу примеры).

Теперь про алгоритмы и тесты. Всё стало совсем интересно когда отписался сам Johnny, сообщив - "у нас нет ассоциативных массивов" (расцениваю как подсказку) и расписал альтернативный алгоритм, с припиской "ну это тем разумеется адресовано, кто захочет размять мозги". Мне мозги долго разминать не пришлось, они у меня итак мягкие "как титька", :) ведь моей первой темой на этом форуме была как раз затронута тема про эти самые ассоциативные массивы, но не в обычном их виде, а в образе ini-файлов. Было это здесь (см. "Второй вариант"). Atas тогда сказал - "Johnny давно всё смог и придумал, нам осталось только правильно этим воспользоваться". Меня тогда порадовал нестандартный подход Атаса к проблеме и удивила скорость работы INIWRITE(), хотя это работа с жестким диском. Как видно из той темы, такой подход тогда был революционным и сегодня похоже стал незаслуженно забытым. Спасибо Atas еще раз.

Первым "установил планку" Андрей, реализовав алгоритм предложенный Johnny. Алгоритм, который есть ничто иное как всем известный брутфорс. Скорость работы которого зиждется на малом количестве данных, которые он перебирает. И в примере с пятью искомыми предметами в логе он легко справлялся.
Я провел тесты для всех предложенных в этой теме алгоритмов, на одних и тех же данных (лог в 5000 коротких строк и 203 уникальных предмета).
Скрипт Андрея показал время 155482 ms. Окно вывода (dialogbox) на моем мониторе не уместилось.

Qwerry изначально имела свою идею и пошла своим путем, она "подняла планку" сразу в 2,6 раза. Её скрипт разобрал тот же лог за 59502 ms. Алгоритм - тоже полный перебор и сравнение.

Скромно скомунизденный мной Atas-ный алгоритм "схавал" те же данные за 3992 ms, что в 14,9 раз быстрее скрипта Qwerry и в 38,9 раз быстрее скрипта Андрея. В алгоритме никакого перебора и никаких сравнений нет, просто кинул в в ini-файл и всё. :)  Ну и сортировку я от себя добавил, это улучшает читаемость результатов.
Причем при разборе механики INIWRITE(), вскрылась незадокументированная способность этой функции обрезать пробелы слева и справа от имени параметра. Опять же большой плюс к быстродействию. Запишу как открытие на свой счет, если никто не предъявит претензий. Я пробовал отрезать эти пробелы двумя циклами, и это увеличивало время работы скрипта почти на 50%.

Так что, можно сказать, ассоциативные массивы у нас есть и они неплохо работают. :)

Если кому интересно - во вложении архив со скриптами для тестов.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: работа с текстом
« Reply #25 on: June 19, 2018, 12:41:47 PM »
Слушай... Ну, что могу сказать... Я сам плотно работаю с ini. У меня сейчас несколько персов качаются в одной гильдии. Они друг другу пати кидают, ходят в данжи гильдии и так далее. "Общаются" они между собой через ini  они у меня. Помимо всего этого, у меня все рабочие скрины проходят регистрацию в ini - ширина, высота, координаты и так далее. Так что, как ты понимаешь, у меня в ini инфы тоже не мало. Но... Что мешает тебе инфу в этих файлах разбить на части и создать для этих частей свои ini? Например, нужна инфа о броне - шерстим файл bronya.ini Ну и так далее...
Я не ду... Потому и не бу...

Атеист

  • Guest
Re: работа с текстом
« Reply #26 on: June 19, 2018, 01:54:23 PM »
Всё верно ini-файлы для того и созданы чтобы хранить информацию в формате "ключ = значение", как в базе данных. Это по сути и есть базы данных, только времён андалов и первых людей)). Но к этой теме они отношения не имеют. Автор темы спросил как подсчитать количество уникальных предметов в текстовом файле, и всё. Будет ли он хранить результаты этих вычислений как базу данных, для сбора торговой статистики например, и в каком формате будет хранить, может в sql, может в mysql, он не сказал.

А про ini-файлы я напомнил из за из сходства с ассоциативными массивами, которые так же имеют формат "ключ = значение". И еще ini-файлы не могут хранить в одной секции несколько параметров с одинаковыми именами. Там не может быть дубликатов ключей. Это очень удобно. Не надо искать место пары, не надо перебирать строки, не надо ничего сравнивать. Достаточно указать имя параметра, значение и секцию, и функция сама положит данные куда надо. И так же легко достает значение параметра из указанной секции. И делает она это очень быстро. Вот и всё).

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: работа с текстом
« Reply #27 on: June 19, 2018, 02:24:50 PM »
Сорри... Просто сегодня у жены день рождения и я уже чуток выпил. И по сему "совсем незаметно" соскользнул с текстовых файлов-логов на ini. А произошло это потому, что я спросил - зачем такие большие файлы логов, а мне в ответ о том, что типа это не логи, а данные о разных шмотках и так далее. Вот у меня в голове и перемешались эти файлы логов и ini-файлы. Так вот о наших тараканах... Что мешает эти файлы (текстовые, как я понимаю...) логов разделить на "подфайлы"? Типа, нужна броня - шерстим bronya.txt Я уже молчу о том, что я не понимаю - почему переменные надо было сохранять в текстовом файле в 5000 строк, а не в ini...

ini-файлы не могут хранить в одной секции несколько параметров с одинаковыми именами
А это для чего-то нужно...?
« Last Edit: June 19, 2018, 02:26:28 PM by Hito »
Я не ду... Потому и не бу...

Атеист

  • Guest
Re: работа с текстом
« Reply #28 on: June 19, 2018, 03:35:22 PM »
Что мешает эти файлы (текстовые, как я понимаю...) логов разделить на "подфайлы"? Типа, нужна броня - шерстим bronya.txt
Лог копируется из игры в текстовый файл. И только после этого начинается его разбор. Можно конечно нарезать его в Блокноте на маленькие куски, если так будет удобнее. А если там все предметы из разных категорий в одну кучу свалены, и броня и зелья? Лучше уж отфильтровать один большой файл от лишнего текста и вычленить из него все предметы, которые кирилицей написаны. А их уже разложить каждый в свою категорию. Нормальная база данных получится,)) где в одной секции броня, в другой пойло, и т.д.

почему переменные надо было сохранять в текстовом файле в 5000 строк, а не в ini...
Это не переменные, а воображаемый лог из игры, этот файл в 5000 строк я сам придумал, только для тестов скрипта. :) Посмотреть бы на настоящий лог, то и гадать бы не пришлось как он выглядит. А почему он не в ini? Это потому что его только предстоит перегнать в ini и там уже разложить по полочкам.

ini-файлы не могут хранить в одной секции несколько параметров с одинаковыми именами
А это для чего-то нужно...?
Конечно нужно, вот тут пример как удалить дубликаты строк из файла - http://crapware.aidf.org/forum/index.php?topic=2815.msg18150#msg18150 во Втором варианте.
Главное ничего сравнивать не надо, просто циклом заливаешь строки в файл командой INIWRITE() и всё.)) Если точно такая строка уже есть в файле, то она как бы не ложится рядом, а перезаписывает уже существующую. И главное - быстрее способа пока типа нет.)

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: работа с текстом
« Reply #29 on: June 19, 2018, 03:53:11 PM »
Это потому что его только предстоит перегнать в ini и там уже разложить по полочкам.
Так ты это сделай, а потом уже проверяй работоспособность проекта...

Конечно нужно
Ты вопроса не понял...) Я спросил - а это для чего-то нужно...? Имея ввиду - кому-то нужно в ini-файле хранить в одной секции несколько параметров с одинаковыми именами...?
Я не ду... Потому и не бу...