- 1
readonly string NEWLINE = "\r\n";
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+137
readonly string NEWLINE = "\r\n";
хотя да, есть Environment.NewLine
Например, HTTP и CSV требуют именно "\r\n" в качестве разделителей строк, независимо от операционной системы.
rfc 4180
ахуеть...
локализованный мс офис класть хотел на стандарт, для него разделитель - системный (и далеко не каждый знает, куда надо влезть, чтобы это отменить)
так что, если ты понадобится без ёбли открывать самодельные csv в русском экселе, то это нельзя не учитывать
(насколько я помню, в опен/либреофисе при открытии csv даже мастер импорта csv файла запускается, который позволяет нащёлкать опций, чтобы этот самый файл открыть)
Ни символ разделителя полей, ни символ экранирующих кавычек rfc не фиксирует, только разделитель строк. В моей либе символы COMMA и QUOTE передаются в конструктор "стрима".
А строки в винде вроде бы всю жизнь разделялись \r\n, независимо от языка системы.
где-то там в жопе экселя есть настройки, которые снимают это поведение
но всем насрать
и экселю насрать, потому что ; это вынужденная мера ради , дробного разделителя
я, когда давно делал лабы, был вынужден смотреть заданную локаль (точка там или запятая), чтобы предугадать поведение экселя и выбрать делимитер
стойкая неприязнь к цсв у меня уже с тех времен
правда там были не лабы, а текстовые таблицы на десятки метров, которые надо было обрабатывать, и проще было бороться с цсв под эксель, чем с xls
все по RFC, экранирование только там где надо, кавычки экранированы. наговариваете вы батенька :)
CSV-формат служит для обмена текстовыми колонками. Их интерпретация лежит на совести тех, кто обменивается данными, и тут всплывают типичные проблемы локалей, не привязанные конкретно к CSV. Читать из потока в локали, отличной от системной - тривиальная задача. Надо просто сообщить принимающей стороне, в какой именно локали файл записан, закодировать в имени файла, например.
по какому RFC разделитель у тебя точка-с-запятой?
> http://tools.ietf.org/html/rfc4180
> COMMA = %x2C
так что я не зря удивился наличию этого стандарта
ноубоди лайкс сиэсви
не рассматривать цсв как портабельный формат обмена между системами
либо при передаче его не говорить "см. рфц", а декларировать, что и как в нем записано
может, ты экранировать любишь через \", а не блядский паскалеораклоебанизм """"
раз уж в xml/json не выходит каменный цветок
Скажи это ФИАС'у и openstreetmap.
Зато с xml/json я могу быть уверен, что почти на любом языке я смогу написать их разбор за несколько минут, при этом мне не придется ебаться с экранированием, разделителями и вообще марать руки о парсинг.
Безобразные стандарты de-facto (json, xml) лучше, чем безобразный велосипед (csv).
2.5 гиговый XML я думаю, ну может 5-6 будет весить. мне вот например нужно было грузить XML пакет, который 20+ гб весит. не сказать, чтобы я не справился, но для тех, кто этот пакет готовит, это видимо проблема. то они иерархию забудут добавить, то нужные поля, то еще чего.
Можно подумать, что эта проблема как-то от формата зависит. С самопальным форматом ты только ёбли с парсингом\генерацией себе добавишь. А если структура выгрузки будет часто меняться - со своим велосипедом будет еще больше боли, чем с xml...
у них был сервис "Регионы", которые рисовали полигон субъектов федерации, и то, основанный на данных OSM, которые по creative commons распространяются.
Что если повезёт, и в библиотеке будет баг, кто угодно сможет подсунуть специальным образом сгенерированный™ xml, который выжрет всю память и даже немного более.
/сарказм
2) Это представляет реальную угрозу только для тех сервисов, в которые xml'ку может загрузить анонимный/псевдонимный мудак.
Само собой, этот выпад не против xml, но против злоумышленников.
Ну вот я вычленял из ФИАС'а улочки и домики нашего региона, без заливки в базу. XML'ки там что-то около 10-20 гиг, емнип. На компе был всего гиг памяти.
Если правильно помню - вся процедура заняла всего лишь 10-15 минут. Причем прога был сляпана еще минут за 10-15 на... пыхе.
Брат жив, никаких OutOfMemory. Потоковый парсинг рулит.
А в чем проблема то? Надо было бы постоянно работать с этими данными - залил бы в базу. Но здесь операция разовая.
Ну хорошо, предложи другой формат выгрузки, с которым я эту задачу решил бы в пределах получаса без заливки в СУБД.
Если использовать от JSON только массивы, выйдет не так много.
Выходит (3cols + 2) rows + 2 накладных расходов (не считая экранирования)
В CSV: (cols + 1) rows - 1 (не считая кавычек и экранирования) или (3cols + 1) rows - 1, если каждая строка будет в кавычках.
В реальности это будет в среднем 5..20% размера файла.
хотя по хорошему, никто не запрещает считывать их по элементам, но там много нюансов
А как же потоковые парсеры? Если структура линейна и умещается в ксв, то и саксом отлично будет читаться.
И есть еще полу-дом парсеры, которые читают по одной ноде и возвращают ее в виде дома. Если файл состоит из миллионов мелких деревьев - удобно.
Файл целиком перестаёт быть валидным JSON, но позволяет добиться потокового эффекта.
я не говорю, что CSV такой хороший, я говорю, что все говно, но для загрузки больших объемов данных он подходит куда лучше чем xml и json.
А в CSV типа не надо писать документацию к формату?
> куда лучше
Да никуда не лучше. По скорости разницы почти не будет - парсинг это копейки по сравнению с той же вставкой в субд. Даже двоичный формат по скорости будет такой же. По объему - в zip'е вроде как че xml че csv будут одинаковы, ну или будут отличаться на копейки.
http://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html
Что примерно выйдет?
CSV всё ещё сложно заменить, когда частичная обработки данных осуществляется человеком. Например, если контент-менеджеры нормализуют/обрабатывают/заполняют данные в Excel или в OpenRefine.
readonly string DOT = ".";
readonly string CONSTANT_STRING = "константа";
readonly string HEAD = "головного";
readonly string BRAIN = "мозга";
readonly string COMMENT = CONSTANT_STRING + SPACE + HEAD + SPACE + BRAIN + DOT;