- 1
readonly string NEWLINE = "\r\n";
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+137
readonly string NEWLINE = "\r\n";
kegdan 19.08.2014 11:54 # +3
хотя да, есть Environment.NewLine
roman-kashitsyn 19.08.2014 11:59 # +4
Например, HTTP и CSV требуют именно "\r\n" в качестве разделителей строк, независимо от операционной системы.
defecate-plusplus 19.08.2014 12:31 # 0
rfc 4180
ахуеть...
roman-kashitsyn 19.08.2014 12:35 # +3
defecate-plusplus 19.08.2014 13:13 # +3
локализованный мс офис класть хотел на стандарт, для него разделитель - системный (и далеко не каждый знает, куда надо влезть, чтобы это отменить)
так что, если ты понадобится без ёбли открывать самодельные csv в русском экселе, то это нельзя не учитывать
(насколько я помню, в опен/либреофисе при открытии csv даже мастер импорта csv файла запускается, который позволяет нащёлкать опций, чтобы этот самый файл открыть)
Vasiliy 19.08.2014 13:18 # 0
anonimb84a2f6fd141 21.08.2014 07:12 # 0
roman-kashitsyn 19.08.2014 13:23 # +4
Ни символ разделителя полей, ни символ экранирующих кавычек rfc не фиксирует, только разделитель строк. В моей либе символы COMMA и QUOTE передаются в конструктор "стрима".
А строки в винде вроде бы всю жизнь разделялись \r\n, независимо от языка системы.
defecate-plusplus 19.08.2014 17:05 # 0
где-то там в жопе экселя есть настройки, которые снимают это поведение
но всем насрать
и экселю насрать, потому что ; это вынужденная мера ради , дробного разделителя
я, когда давно делал лабы, был вынужден смотреть заданную локаль (точка там или запятая), чтобы предугадать поведение экселя и выбрать делимитер
стойкая неприязнь к цсв у меня уже с тех времен
правда там были не лабы, а текстовые таблицы на десятки метров, которые надо было обрабатывать, и проще было бороться с цсв под эксель, чем с xls
Lokich 19.08.2014 13:50 # 0
все по RFC, экранирование только там где надо, кавычки экранированы. наговариваете вы батенька :)
bormand 19.08.2014 15:15 # +3
roman-kashitsyn 19.08.2014 15:18 # +2
anonimb84a2f6fd141 21.08.2014 07:13 # 0
roman-kashitsyn 21.08.2014 09:46 # +1
CSV-формат служит для обмена текстовыми колонками. Их интерпретация лежит на совести тех, кто обменивается данными, и тут всплывают типичные проблемы локалей, не привязанные конкретно к CSV. Читать из потока в локали, отличной от системной - тривиальная задача. Надо просто сообщить принимающей стороне, в какой именно локали файл записан, закодировать в имени файла, например.
defecate-plusplus 19.08.2014 16:27 # +1
по какому RFC разделитель у тебя точка-с-запятой?
> http://tools.ietf.org/html/rfc4180
> COMMA = %x2C
roman-kashitsyn 19.08.2014 16:40 # 0
defecate-plusplus 19.08.2014 17:00 # 0
так что я не зря удивился наличию этого стандарта
ноубоди лайкс сиэсви
Lokich 19.08.2014 17:07 # 0
defecate-plusplus 19.08.2014 17:13 # 0
не рассматривать цсв как портабельный формат обмена между системами
либо при передаче его не говорить "см. рфц", а декларировать, что и как в нем записано
может, ты экранировать любишь через \", а не блядский паскалеораклоебанизм """"
раз уж в xml/json не выходит каменный цветок
Lokich 19.08.2014 17:24 # 0
bormand 19.08.2014 17:40 # +4
Скажи это ФИАС'у и openstreetmap.
Зато с xml/json я могу быть уверен, что почти на любом языке я смогу написать их разбор за несколько минут, при этом мне не придется ебаться с экранированием, разделителями и вообще марать руки о парсинг.
Безобразные стандарты de-facto (json, xml) лучше, чем безобразный велосипед (csv).
Lokich 19.08.2014 17:53 # 0
2.5 гиговый XML я думаю, ну может 5-6 будет весить. мне вот например нужно было грузить XML пакет, который 20+ гб весит. не сказать, чтобы я не справился, но для тех, кто этот пакет готовит, это видимо проблема. то они иерархию забудут добавить, то нужные поля, то еще чего.
bormand 19.08.2014 17:56 # 0
Можно подумать, что эта проблема как-то от формата зависит. С самопальным форматом ты только ёбли с парсингом\генерацией себе добавишь. А если структура выгрузки будет часто меняться - со своим велосипедом будет еще больше боли, чем с xml...
Lokich 20.08.2014 14:55 # 0
Lokich 19.08.2014 18:02 # 0
bormand 19.08.2014 18:04 # 0
Lokich 20.08.2014 14:59 # 0
у них был сервис "Регионы", которые рисовали полигон субъектов федерации, и то, основанный на данных OSM, которые по creative commons распространяются.
eth0 19.08.2014 18:08 # 0
Что если повезёт, и в библиотеке будет баг, кто угодно сможет подсунуть специальным образом сгенерированный™ xml, который выжрет всю память и даже немного более.
/сарказм
bormand 19.08.2014 18:14 # 0
2) Это представляет реальную угрозу только для тех сервисов, в которые xml'ку может загрузить анонимный/псевдонимный мудак.
eth0 19.08.2014 18:29 # 0
Само собой, этот выпад не против xml, но против злоумышленников.
anonimb84a2f6fd141 21.08.2014 07:14 # −1
bormand 21.08.2014 07:51 # +1
bormand 19.08.2014 17:52 # 0
Ну вот я вычленял из ФИАС'а улочки и домики нашего региона, без заливки в базу. XML'ки там что-то около 10-20 гиг, емнип. На компе был всего гиг памяти.
Если правильно помню - вся процедура заняла всего лишь 10-15 минут. Причем прога был сляпана еще минут за 10-15 на... пыхе.
Брат жив, никаких OutOfMemory. Потоковый парсинг рулит.
Lokich 19.08.2014 17:57 # 0
bormand 19.08.2014 18:00 # 0
А в чем проблема то? Надо было бы постоянно работать с этими данными - залил бы в базу. Но здесь операция разовая.
Ну хорошо, предложи другой формат выгрузки, с которым я эту задачу решил бы в пределах получаса без заливки в СУБД.
wvxvw 19.08.2014 18:04 # +1
bormand 19.08.2014 18:10 # 0
wvxvw 19.08.2014 18:18 # +1
1024-- 19.08.2014 19:33 # 0
Если использовать от JSON только массивы, выйдет не так много.
Выходит (3cols + 2) rows + 2 накладных расходов (не считая экранирования)
В CSV: (cols + 1) rows - 1 (не считая кавычек и экранирования) или (3cols + 1) rows - 1, если каждая строка будет в кавычках.
В реальности это будет в среднем 5..20% размера файла.
Lokich 20.08.2014 15:08 # 0
хотя по хорошему, никто не запрещает считывать их по элементам, но там много нюансов
bormand 20.08.2014 15:29 # 0
А как же потоковые парсеры? Если структура линейна и умещается в ксв, то и саксом отлично будет читаться.
И есть еще полу-дом парсеры, которые читают по одной ноде и возвращают ее в виде дома. Если файл состоит из миллионов мелких деревьев - удобно.
roman-kashitsyn 20.08.2014 15:31 # +1
Файл целиком перестаёт быть валидным JSON, но позволяет добиться потокового эффекта.
Lokich 20.08.2014 15:40 # 0
я не говорю, что CSV такой хороший, я говорю, что все говно, но для загрузки больших объемов данных он подходит куда лучше чем xml и json.
bormand 21.08.2014 05:48 # 0
А в CSV типа не надо писать документацию к формату?
> куда лучше
Да никуда не лучше. По скорости разницы почти не будет - парсинг это копейки по сравнению с той же вставкой в субд. Даже двоичный формат по скорости будет такой же. По объему - в zip'е вроде как че xml че csv будут одинаковы, ну или будут отличаться на копейки.
Lokich 21.08.2014 15:05 # 0
http://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html
anonimb84a2f6fd141 21.08.2014 07:15 # −1
1024-- 21.08.2014 11:29 # 0
Что примерно выйдет?
roman-kashitsyn 20.08.2014 15:02 # 0
CSV всё ещё сложно заменить, когда частичная обработки данных осуществляется человеком. Например, если контент-менеджеры нормализуют/обрабатывают/заполняют данные в Excel или в OpenRefine.
Lokich 19.08.2014 13:08 # 0
gost 19.08.2014 18:40 # +1
readonly string DOT = ".";
readonly string CONSTANT_STRING = "константа";
readonly string HEAD = "головного";
readonly string BRAIN = "мозга";
readonly string COMMENT = CONSTANT_STRING + SPACE + HEAD + SPACE + BRAIN + DOT;
TauSigma 20.08.2014 16:54 # +1
guest 19.08.2014 19:41 # −5
guest 26.09.2014 08:19 # −1
guest 30.09.2014 20:46 # −1