1. Ruby / Говнокод #18505

    −137

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    begin
          # Это пиздец
          artist_title = row.title.split(/ - /)
          if artist_title.length > 1
            row.artist = artist_title[0]
            row.title  = artist_title[1]
          else
            artist_title = row.title.split(/ — /)
            if artist_title.length > 1
              row.artist = artist_title[0]
              row.title  = artist_title[1]
            else
              artist_title = row.title.split(/ - /)
              if artist_title.length > 1
                row.artist = artist_title[0]
                row.title  = artist_title[1]
              else
                artist_title = row.title.split(/ – /)
                if artist_title.length > 1
                  row.artist = artist_title[0]
                  row.title  = artist_title[1]
                else
                  artist = row.title.match(/\((.*?)\)/)
                  artist = artist.captures[0]
                  # puts artist_title
                  # puts row.title
                  # puts artist
                  row.artist = artist
                  row.title  = row.title.gsub('('+artist+')', '').strip
                end
              end
            end
          end
        rescue
          next
        end

    Запостил: gerasim13, 21 Июля 2015

    Комментарии (40) RSS

    • 7 раз отмерь, 1 раз отрежь
      Ответить
    • показать все, что скрытоТут цикл подошел бы
      Ответить
      • Я не знаток Ruby, но мне кажется, что цикл данный код не спасёт.

        Что поступает на вход в 8-й строке и чем оно отличается от 3-й строки?
        Ответить
        • показать все, что скрытоЯвно код повторяется
          artist_title = row.title.split(/ - /)
                    if artist_title.length > 1
                      row.artist = artist_title[0]
                      row.title  = artist_title[1]
                    else
                      artist_title = row.title.split(/ – /)
                      if artist_title.length > 1
                        row.artist = artist_title[0]
                        row.title  = artist_title[1]
          Ответить
          • Спасибо, капитан. А теперь внимание, вопрос. Зачем повторять действие row.title.split(/ – /) ? Метод split имеет побочный эффект или значение row.title между вызовами может ВНЕЗАПНО измениться кем-то ещё?
            Ответить
            • показать все, что скрытоТак далеко я не вчитывался :)
              Ответить
              • Всё оказалось круче, чем я предполагал. Там всё-таки РАЗНЫЕ действия. См. подсказку Dummy00001.
                Ответить
                • показать все, что скрытоЯ все еще нихуя не понял.jpg
                  Ответить
                • показать все, что скрытоВсе равно, foreach по списку символов
                  Ответить
                  • Уговорил, цикл нужен. Хоть явный (foreach), хоть неявный (регулярка).

                    Причём не факт, что именно по списку символов. Тут, как оказалось, не только тире, но и пробелы могут быть разными. Как бы не пришлось тут городить что-то сложное...
                    Ответить
                    • Открываем Библию, читаем...
                      "... С блудниками да не общайтесь"
                      Ответить
                      • Ссылочку не подскажете? Книга, глава, стих?
                        Ответить
                        • Запамятовал я, отрок. Кагорцу перебрал, на венчание двух мужеложников.
                          Ответить
                          • Первое послание к коринфянам, глава 5:
                            9 Я писал вам в послании — не сообщаться с блудниками;
                            10 впрочем не вообще с блудниками мира сего, или лихоимцами, или хищниками, или идолослужителями, ибо иначе надлежало бы вам выйти из мира  сего.
                            11 Но я писал вам не сообщаться с тем, кто, называясь братом, остается блудником, или лихоимцем, или идолослужителем, или злоречивым, или пьяницею, или хищником; с таким даже и не есть вместе.


                            Боюсь, что на 3_14дара этот запрет не распространяется, ибо считает он, что никогда мы не будем братьями.
                            Ответить
            • Ну там в одном случае дефис - в другом тире

              Да, я немного опоздал)
              Ответить
          • > -28
            Блин, ну лучше бы скрытым постам въебали по 28 плюсов, чем тратить ботов на разжигание сёминой жопы...
            Ответить
    • напомнило. народ тут доку пилил для Линуха в ВинВорде.

      при тесте доки, долго возмущалисть что "bash ––version" не работает почему то.
      Ответить
      • Слона-то я и не заметил... И ещё вступил в идиотскую полемику...

        Но в любом случае цикл не нужен, раз уж мы используем регулярки. Все варианты тире можно проверить одним выражением.
        Ответить
        • > Слона-то я и не заметил...

          Я глубого этой темой на редактировании ебуков проникся: удаляешь тире по всей книге, редактор говорит что удалил тыщи раз, открываешь книгу - а она все еще полна тире. Как выяснилось, в юникоде есть пачка тире/дефисов/прочее, и когда чистишь книгу это может обернуться серьёзным гемороем. Вот тогда то я и научился распозновать эти юникодные какашки.

          Большинство из символов выглядят почти одинаково, но есть один из них - тире, строка #18 сверху - который длинее все остальных, и он "касается" краев баундинг бокса символа. Его легко распознать если этот символ выделить: становится видно что он касается краев.
          Ответить
          • Тот, что в строке 8, тоже вроде бы касается краёв, хотя всё-же немного другой символ. Ради интереса написал чекер:
            $('span.regexp').each(function(_, e) {
                var i, s = $(e).text(), out = "";
                for (i = 0; i < s.length; ++i) {
                    out += " " + s.charCodeAt(i);
                }
                console.log(out);
            });

            Выхлоп для строк с тире следующий:
            47 160 45 32 47
            47 32 8212 32 47
            47 32 45 32 47
            47 32 8211 32 47
            Первый регекс отличается от третьего использованием &nbsp;, у второго и четвёртого кодпоинты отличаются на единицу.
            Ответить
            • Лол, хотел отредактировать свой комментарий, а ГК при открытии окна редактирования заменил энтити &nbsp; на реальный пробел.
              Ответить
              • 8212 и 8211 - это они и есть. (в VIM: ^K-N и ^K-M и потом ga коды посмотрите.)

                но в юникоде их есть еще больше:

                http://www.fileformat.info/info/unicode/category/Pd/list.htm
                Ответить
              • к слову с 0xA0 (nbsp) теже грабли случаются.

                в юникоде подобных есть тоже пачка - http://www.fileformat.info/info/unicode/category/Zs/list.htm - но к счастью я только на 0xA0 натыкался.
                Ответить
          • показать все, что скрытоРаньше был гимор с кодировками, теперь - гимор с юникодом?
            Ответить
            • С пробелами геморрой был ещё до Юникода (NBSP появился в восьмибитных кодировках). Юникод просто увеличил количество представлений для некоторых символов.

              Юникод непоследователен. Его создатели так и не определились, что соответствует коду: семантическое значение символа или его графический вид. Так появилось несколько символов, которые графически идентичны, но имеют разную семантику, и несколько символов, у которых назначение одинаковое, но несколько графических форм.

              Но данный ГК даже не об этом. С создателем списка произведений, как я понял, нет обратной связи, поэтому договориться о формате, который бы однозначно парсился, невозможно. Приходится глотать кашу из разных разделителей.
              Ответить
            • гемор с юникодом кратковременный. после пары залётов, и опыт появляется проблему замечать, и регулярки/этц уже есть в заготовках.

              гемор с кодировками - это долгосрочно, постоянно и без остановки.
              Ответить
              • Иногда хочется тупо сохранять в ascii, чтобы всякое говно не лезло.
                Ответить
      • интересно, чем же напомнило?
        Ответить
        • Быть может, дефисы и тире?
          Ответить
          • неужели там так много вариаций?
            в любом случае, это можно было в цикле сделать, по всем вариациям сделать, а не 100500 if else писать.
            да даже если и так, если там встретится еще один дефис, то можно неплохо так говном наестся
            Ответить
            • Самое интересное, что название фильма/спектакля/книги/чего-то ещё может содержать дефисы и тире (и даже несколько штук), и фамилии бывают двойными, так что парсинг афиш — дело неблагодарное.
              Ответить
              • там скорее музыка парсилась. энивэй, яндекс же музыку парсит.
                Ответить
                • Ещё лучше.
                  Андерс Т. — Болен Д. — Ты — моё сердце, ты — моя душа.
                  Ответить
                  • я думаю, у них там есть специально обученные люди, которые валидируют это
                    Ответить
                    • Поясните свою мысль.
                      Ответить
                      • видимо имелось в виду, что парсит специально обученный абезьйан, а не программа
                        Ответить
                        • Этот абезьйан носит гордое имя контент менеджер.
                          Ответить
                      • это значит то, что перед тем, как конечный пользователь увидит результат, оператор/контент менеджер проверит то, как распарсилось название композиции, и в случае необходимости они подкорректируют ее руками.
                        хотя, может я фантазирую, и в яндекс-музыку все заносится руками, но если бы была вероятность профакапиться в том, как алгоритм ее распарсит, я бы посадил людей, которые будут либо аппрувить это, либо руками вносить правки
                        Ответить

    Добавить комментарий