1. C# / Говнокод #16561

    +137

    1. 1
    readonly string NEWLINE = "\r\n";

    Запостил: Smekalisty, 19 Августа 2014

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

    • Что не так?
      хотя да, есть Environment.NewLine
      Ответить
    • Без контекста не говняно.
      Например, HTTP и CSV требуют именно "\r\n" в качестве разделителей строк, независимо от операционной системы.
      Ответить
      • у csv что, есть стандарт?
        rfc 4180
        ахуеть...
        Ответить
        • я пиарюсь
          https://github.com/roman-kashitsyn/text-csv
          Ответить
          • только тут такая беда...
            локализованный мс офис класть хотел на стандарт, для него разделитель - системный (и далеко не каждый знает, куда надо влезть, чтобы это отменить)
            так что, если ты понадобится без ёбли открывать самодельные csv в русском экселе, то это нельзя не учитывать

            (насколько я помню, в опен/либреофисе при открытии csv даже мастер импорта csv файла запускается, который позволяет нащёлкать опций, чтобы этот самый файл открыть)
            Ответить
            • еще одна причина почему open source лучше.
              Ответить
              • Больше пространства для пердолинга? Limux после 10 лет сдулся, сколько там уже лет непрерывных успехов? http://habrahabr.ru/post/233813/
                Ответить
            • Ты говоришь о разделителе полей или разделителе строк?
              Ни символ разделителя полей, ни символ экранирующих кавычек rfc не фиксирует, только разделитель строк. В моей либе символы COMMA и QUOTE передаются в конструктор "стрима".
              А строки в винде вроде бы всю жизнь разделялись \r\n, независимо от языка системы.
              Ответить
              • системный - это как раз про ;
                где-то там в жопе экселя есть настройки, которые снимают это поведение
                но всем насрать
                и экселю насрать, потому что ; это вынужденная мера ради , дробного разделителя

                я, когда давно делал лабы, был вынужден смотреть заданную локаль (точка там или запятая), чтобы предугадать поведение экселя и выбрать делимитер
                стойкая неприязнь к цсв у меня уже с тех времен
                правда там были не лабы, а текстовые таблицы на десятки метров, которые надо было обрабатывать, и проще было бороться с цсв под эксель, чем с xls
                Ответить
            • специально попробовал сохранить CSV
              аа;"б""б""б";вввCRLF
              ггг;ддд;"""еее"""CRLF

              все по RFC, экранирование только там где надо, кавычки экранированы. наговариваете вы батенька :)
              Ответить
              • Ага, а теперь числа сохрани. Иностранный ворд напишет через точку, а местный - через запятую. Удачного преобразования.
                Ответить
                • а вот это уже не проблемы csv, а проблемы локалей
                  Ответить
                  • Я правильно понял, что импорт на системе с другой локалью нинужен?
                    Ответить
                    • Нужен, разумеется. Я не говорю, что проблемы нет, я лишь утверждаю, что она в другом месте.

                      CSV-формат служит для обмена текстовыми колонками. Их интерпретация лежит на совести тех, кто обменивается данными, и тут всплывают типичные проблемы локалей, не привязанные конкретно к CSV. Читать из потока в локали, отличной от системной - тривиальная задача. Надо просто сообщить принимающей стороне, в какой именно локали файл записан, закодировать в имени файла, например.
                      Ответить
              • > все по RFC
                по какому RFC разделитель у тебя точка-с-запятой?

                > http://tools.ietf.org/html/rfc4180
                > COMMA = %x2C
                Ответить
                • Мдя, я слегка лопухнулся. Кстати, юникод, видимо, в TEXTDATA не помещается.
                  Ответить
                  • с их условиями - нет, не помещается
                    так что я не зря удивился наличию этого стандарта
                    ноубоди лайкс сиэсви
                    Ответить
                    • другие варианты?
                      Ответить
                      • pisat translitom "," konechno "," i sledovat standartu kakogoto mudaka "," potomu chto eto standartCRLF

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

                        раз уж в xml/json не выходит каменный цветок
                        Ответить
                        • xml&json тяжелые для больших объемов, а там пох, построчное чтение, и нет OutOfMemoryException
                          Ответить
                          • > xml&json тяжелые для больших объемов
                            Скажи это ФИАС'у и openstreetmap.

                            Зато с xml/json я могу быть уверен, что почти на любом языке я смогу написать их разбор за несколько минут, при этом мне не придется ебаться с экранированием, разделителями и вообще марать руки о парсинг.

                            Безобразные стандарты de-facto (json, xml) лучше, чем безобразный велосипед (csv).
                            Ответить
                            • ну, справедливости ради, там структурированные данные, которые по другому хз как выгружать, к тому же это не такие большие объемы... ну... по идее. энивей, есть DBF.
                              2.5 гиговый XML я думаю, ну может 5-6 будет весить. мне вот например нужно было грузить XML пакет, который 20+ гб весит. не сказать, чтобы я не справился, но для тех, кто этот пакет готовит, это видимо проблема. то они иерархию забудут добавить, то нужные поля, то еще чего.
                              Ответить
                              • > то они иерархию забудут добавить, то нужные поля, то еще чего
                                Можно подумать, что эта проблема как-то от формата зависит. С самопальным форматом ты только ёбли с парсингом\генерацией себе добавишь. А если структура выгрузки будет часто меняться - со своим велосипедом будет еще больше боли, чем с xml...
                                Ответить
                                • XSD схема документа четко описана в ТЗ, и чтобы изменить ее, нужны будут доп. работы.
                                  Ответить
                            • кстати, вопрос не в тему, но, может в курсе. есть ли где-то геокоды для ОКАТО или ОКТАМО?
                              Ответить
                              • Привязка адресов к геоданным? Ну я у яндекса видел подобный сервис, но там не ОКАТО, а просто адреса. А чтобы скачать и импортнуть себе в базу - не попадалось.
                                Ответить
                                • скорее полигон координат районов. Яндекс возвращает одну точку, по сути середины улицы.
                                  у них был сервис "Регионы", которые рисовали полигон субъектов федерации, и то, основанный на данных OSM, которые по creative commons распространяются.
                                  Ответить
                            • > Зато с xml/json я могу быть уверен
                              Что если повезёт, и в библиотеке будет баг, кто угодно сможет подсунуть специальным образом сгенерированный™ xml, который выжрет всю память и даже немного более.
                              /сарказм
                              Ответить
                              • 1) Во многих либах эту багофичу с entity бомбой уже пофиксили.
                                2) Это представляет реальную угрозу только для тех сервисов, в которые xml'ку может загрузить анонимный/псевдонимный мудак.
                                Ответить
                                • Или файл был модифицирован злоумышленником и/или был обработан невнимательным пользователем из недостоверного источника.
                                  Само собой, этот выпад не против xml, но против злоумышленников.
                                  Ответить
                              • Пыхопроблемы?
                                Ответить
                                • Да почему, эта entity-бомба много где работала, не только в пыхе. Практически везде, на самом деле, пока в большинстве либ не ограничили вложенность entity.
                                  Ответить
                          • > OutOfMemoryException
                            Ну вот я вычленял из ФИАС'а улочки и домики нашего региона, без заливки в базу. XML'ки там что-то около 10-20 гиг, емнип. На компе был всего гиг памяти.

                            Если правильно помню - вся процедура заняла всего лишь 10-15 минут. Причем прога был сляпана еще минут за 10-15 на... пыхе.

                            Брат жив, никаких OutOfMemory. Потоковый парсинг рулит.
                            Ответить
                            • ну конечно, SAX'ом парсить 10-20 гигов, чтобы найти там нужную информацию...
                              Ответить
                              • > ну конечно, SAX'ом парсить 10-20 гигов, чтобы найти там нужную информацию...
                                А в чем проблема то? Надо было бы постоянно работать с этими данными - залил бы в базу. Но здесь операция разовая.

                                Ну хорошо, предложи другой формат выгрузки, с которым я эту задачу решил бы в пределах получаса без заливки в СУБД.
                                Ответить
                          • http://www.hdfgroup.org/HDF5/
                            Ответить
                            • А есть либы под все-все-все языки? Я навскидку вижу только жабу и шарп.
                              Ответить
                              • Есть еще для R - это то, что я использовал. Есть для ОКамла, есть для Лиспа, но очень низкоуровневые, просто обвязка, без какого-либо дополнительного кода. Есть для Питона. Больше не искал.
                                Ответить
                          • > xml&json тяжелые для больших объемов
                            Если использовать от JSON только массивы, выйдет не так много.
                            Выходит (3cols + 2) rows + 2 накладных расходов (не считая экранирования)
                            В CSV: (cols + 1) rows - 1 (не считая кавычек и экранирования) или (3cols + 1) rows - 1, если каждая строка будет в кавычках.
                            [["xxx","yyy","zzz"],["xxx","yyy","zzz"],["xxx","yyy","zzz"]]

                            В реальности это будет в среднем 5..20% размера файла.
                            Ответить
                            • проблема в том, что CSV файл можно спокойно считывать построчно, а в случае с XML это DOM, а в случае с JSON это большой объект.
                              хотя по хорошему, никто не запрещает считывать их по элементам, но там много нюансов
                              Ответить
                              • > а в случае с XML это DOM
                                А как же потоковые парсеры? Если структура линейна и умещается в ксв, то и саксом отлично будет читаться.

                                И есть еще полу-дом парсеры, которые читают по одной ноде и возвращают ее в виде дома. Если файл состоит из миллионов мелких деревьев - удобно.
                                Ответить
                                • Есть ещё техника "один json-документ в строке"
                                  Файл целиком перестаёт быть валидным JSON, но позволяет добиться потокового эффекта.
                                  Ответить
                                • я уже говорил, что парсить файл можно как угодно, но при таком подходе нужно жестко оговаривать то, как будут упакованы данные, и жесткий формат.
                                  я не говорю, что CSV такой хороший, я говорю, что все говно, но для загрузки больших объемов данных он подходит куда лучше чем xml и json.
                                  Ответить
                                  • > но при таком подходе нужно жестко оговаривать то, как будут упакованы данные, и жесткий формат
                                    А в CSV типа не надо писать документацию к формату?

                                    > куда лучше
                                    Да никуда не лучше. По скорости разницы почти не будет - парсинг это копейки по сравнению с той же вставкой в субд. Даже двоичный формат по скорости будет такой же. По объему - в zip'е вроде как че xml че csv будут одинаковы, ну или будут отличаться на копейки.
                                    Ответить
                                    • смотря что за СУБД, есть например http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.9 0).aspx. вполне себе ок результат
                                      http://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html
                                      Ответить
                            • Сжатие забыл.
                              Ответить
                              • Со сжатием так просто не прикинешь.
                                Что примерно выйдет?
                                Ответить
                        • > не рассматривать цсв как портабельный формат обмена между системами

                          CSV всё ещё сложно заменить, когда частичная обработки данных осуществляется человеком. Например, если контент-менеджеры нормализуют/обрабатывают/заполняют данные в Excel или в OpenRefine.
                          Ответить
        • конечно есть, думаешь я просто так хуесосил долбаебов, которые делали "конвертер" XLS->CSV, где вместо того, чтобы экранировать двойную кавычку они ее просто удаляли, а ; заменяли на SemocoloN, и потом его не заменяли обратно? столько сюрпризов было, когда данные из этих "CSV" пытались сопоставить с исходными данными...
          Ответить
    • readonly string SPACE = " ";
      readonly string DOT = ".";
      readonly string CONSTANT_STRING = "константа";
      readonly string HEAD = "головного";
      readonly string BRAIN = "мозга";

      readonly string COMMENT = CONSTANT_STRING + SPACE + HEAD + SPACE + BRAIN + DOT;
      Ответить
      • internal struct Constants {
        	public const String SPACE = " ";
        	public const String DOT = ".";
        	public const String CONSTANT_STRING = "константа";
        	public const String HEAD = "головного";
        	public const String BRAIN = "мозга";
        	public const String COMMENT = CONSTANT_STRING + SPACE + HEAD + SPACE + BRAIN + DOT;
        	//Тоже годный вариант, если необходимо ещё и рантайм вычисление:
        	//public static readonly String COMMENT = CONSTANT_STRING + SPACE + HEAD + SPACE + BRAIN + DOT;
        }
        Ответить
    • показать все, что скрытоЯ, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:
      Ответить
    • Your article peeclftry shows what I needed to know, thanks!
      Ответить
    • No more s***. All posts of this qulitay from now on http://bhcslpdwy.com [url=http://udefcba.com]udefcba[/url] [link=http://zvympocqh.com]zvympocqh[/link]
      Ответить

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