Чому кома поганий роздільник запису / роздільник обмежень у файлах CSV?


32

Я читав цю статтю і мені цікаво правильна відповідь на це питання.

Єдине, що мені спадає на думку, це, мабуть, що в деяких країнах десятковий роздільник є комою, і це можуть бути проблеми при обміні даними в CSV , але я не дуже впевнений у своїй відповіді.


6
Майже будь-який роздільник є кращим, ніж кома. Причина полягає в тому, що під час читання файлів, розміщених комами, до деяких засобів аналізу даних, коми можуть переплутатись з пунктуацією, порушуючи "компонування" полів або стовпців.
Майк Хантер

33
Цинік, зауваживши, що ця стаття є слоєм SAS, може припустити, що, можливо, у SAS є проблеми з обробкою CSV-файлів комами :-).
whuber

3
@whuber - SAS (на мій досвід) може боротися з файлами CSV, чи є вони комами чи ні, вимагаючи величезної кількості кодування вручну для кожної дивної речі, яка SAS не любить.
Джеремі Майлз

8
Існує відчайдух у пошуку все більш неясних розмежувачів - труб, стовпчиків, шипів - це дозволяє погодитись і дотримуватися стандарту - це справді єдиний безпечний спосіб для обміну даними в розмежуваних текстових файлах. І універсальний стандарт повинен дозволяти представляти будь-який текстовий рядок (як і RFC4180), а не покладатися на припущення про те, що деяким не потрібно буде & можна перенести на інші роботи.
Scortchi

2
(a) Я часто імпортував .csv файли успішно. (b) Я раджу людям не використовувати .csv, якщо вони містять коми у своїх даних. Вони не суперечать один одному. Прикро, що (б) потребує пояснення в деяких кварталах.
Нік Кокс

Відповіді:


33

Специфікація формату CSV визначена в RFC 4180 . Ця специфікація була опублікована, оскільки

не існує офіційної специфікації, яка дозволяє проводити широкий спектр інтерпретацій файлів CSV

На жаль, з 2005 року (дата публікації RFC) нічого не змінилося. У нас все ще існує широкий вибір. Загальний підхід, визначений у RFC 4180, полягає у включенні полів, що містять символи, такі як коми у лапках, однак ця рекомендація не завжди відповідає іншому програмному забезпеченню.

Проблема полягає в тому, що в різних європейських локалях символ кома виступає в якості десяткової крапки, тому ви пишете 0,005замість 0.005. Однак в інших випадках коми використовуються замість пробілів для сигналізації знакових груп, наприклад 4,000,000.00(див. Тут ). В обох випадках використання коми може призвести до помилок при читанні даних з CSV-файлів, оскільки ваше програмне забезпечення насправді не знає, чи 0,005, 0,1є два чи чотири різні числа (див. Приклад тут ).

І останнє, але не менш важливе значення, якщо ви зберігаєте текст у вашому файлі даних, то коси в тексті набагато частіше зустрічаються, ніж, наприклад, крапки з комою, тому якщо ваш текст не укладений у лапки, такі дані також можна легко читати з помилками .

Ніщо не робить коми кращими або гіршими роздільниками поля , що стосується файлів CSV відповідно до рекомендацій як RFC 4180, які захищають від описаних вище проблем. Однак якщо є ризик використання спрощеного формату CSV, який не закриває поля лапками, або рекомендація може бути використана непослідовно, тоді інші роздільники (напр. Крапка з комою) здаються більш безпечним підходом.


6
Добре, що будь-яке програмне забезпечення, що реалізує фактичний стандарт CSV, визначений RFC 4180, безумовно, точно знатиме, як інтерпретувати будь-яку задану рядок. Аргумент про те, що використання ,замість рідкісного роздільника роздуває дані, оскільки вам доведеться весь час уникати цього, правда, правда. І очевидно, що є всі ті люди, які думають, що вони знають, як працює CSV, але насправді це не так.
Voo

2
@Voo Так, але оскільки файли "csv" використовуються настільки хаотично, безпечніше не використовувати коми, а замість них використовувати інші роздільники, напр. Крапки з комою. Це відповідь на питання ОП. Немає нічого кращого в крапках з комою (чи іншими комами) порівняно з комами, вони просто просто безпечніший вибір у багатьох випадках.
Тім

2
@Voo +1 до вашого коментаря. Однак, хто використовує CSV, насправді не хвилює роздуті файли даних!
whuber

17

Технічно кома є такою ж доброю, як і будь-який інший символ, який використовується як роздільник. Назва формату безпосередньо посилається на те, що значення розділені комами (Значення, розділені комами).

В описі формату CSV використовується кома як роздільник.

Будь-яке поле, що містить коми, має бути подвійним цитуванням. Отже, це не спричиняє проблем з читанням даних. Дивіться пункт 6 з опису :

  1. Поля, що містять розриви рядків (CRLF), подвійні лапки та коми повинні бути укладені у подвійні лапки.

Наприклад, функції read.csvта write.csvз R за замовчуванням використовують косу як роздільник.


4
Це найкраща відповідь, оскільки йдеться про valuesте, що розділені комами. Інші натякають на європейські formattingцифри, це не проблема для csv standard, як ви правильно цитуєте пункт 6 вище. Відмінності від "правильного використання" існують у будь-якому форматі даних. Справа в тому, - знати свої дані. Інші згадують tabабо ;обмежують, однак вони можуть мати ті ж проблеми, що і коми, коли ви маєте справу з даними, які вводяться користувачем (можливо, через форму та захоплені базою даних - мені довелося боротися із полями для введення тексту, які вільні люди жир перебирають у tab... це смокче)
Адріан Торрі

Відповідь Тіма тепер відредаговано, щоб включити інформацію, надану @djhurio.
Адріан Торрі

11

Окрім того, що є роздільником цифр у числах, він також є частиною адреси (наприклад, адреса клієнта тощо) у багатьох країнах. Хоча деякі країни мають короткі чітко визначені адреси, у багатьох інших є адреси з довгими обмотками, включаючи, іноді, дві коми в одному рядку. Хороші файли CSV додають усі такі дані у подвійні лапки. Але занадто спрощені, погано написані аналізатори не забезпечують їх читання та розмежування. (Тоді виникає проблема використання подвійних лапок як частини даних, наприклад цитата з вірша).


2
(+1) Стандарт передбачає використання подвійних лапок як частини даних, наполягаючи на їх подвоєнні: "Belloc", "Tarantella", "" "блохи, які дражнять у Високих Піренеях" "". В Англії нечасто зустрічаються адресні поля, що містять назву будинку в лапках, таким чином: "Chatsworth", Melton Road, Leamington. (Не ясно , чому: Fowler бурчав , що «імплікація , здається: жити в будинку , який розсудливі люди називають" 164 Мелтон - роуд ", але один дурень любить називати" Chatsworth "».)
Scortchi - відновимо Моніка

1
@Scortchi Здається, що ті самі вірші ми дізналися у віці 12 років (помилка +/-). Я побоююсь, що те, що я читав як невдале англійське снобізм верхнього середнього класу за звичками нижнього середнього класу, затьмарює ваш останній приклад, який не буде прозорим поза межами невеликої групи.
Нік Кокс

@ NickCox: Дванадцять звуків справа. Смішно, що я не можу пригадати, чи читав я цього року будь-які вірші, не кажучи вже про будь-які рядки з них. Хоча пункт Фоулера стосувався впливу на читача непотрібних лапок (див. Nepotreban quotes.com ), я вважаю, що ви праві бачити вплив снобізму в його виборі прикладу. У будь-якому випадку, я сподіваюся, що досить незначний момент, що на це слід дивитись, якщо ви коли-небудь надіслали файл CSV, що містить англійські адреси, зрозумілий усім, незважаючи на мої розбіжності.
Scortchi

1
в Індії людям, які будують свої перші будинки (а не квартири), зазвичай зберігають інноваційну назву квітів, часто просторічною мовою або санскритською фразою, і вони містяться в подвійних лапках, наприклад, "Гуру Крипа". Такі імена, як Женелія Д'Суза та Дерек О'Браєн, також поширені. Тоді адреси, які говорять: "Стара дверна № nnn / нова дверцята № мм / с", завдяки урядовому переносуванню, ще більше ускладнює зберігання адрес, тому що в кутах з'являються косої риски та одинарні лапки.
Вир розуму

@WhirlMind: Це цікаво - я помітив багато - ну, більше, ніж я очікував - шотландських гельських і валійських назв будинків в Англії, що, можливо, є найближчим еквівалентом вибору просторічної мови, якою назвати свій дім.
Scortchi

9

Хоча відповідь @Tim правильна - я хотів би додати, що "csv" в цілому не має загального стандарту - особливо правила уникнення не визначені взагалі, що призводить до "форматів", які можна прочитати в одній програмі, але не в іншій . Це обумовлено тим, що кожен "програміст" під сонцем просто думає, "оооо, csv- я буду буду свій аналізатор!" а потім пропускає всі крайові випадки.

Більше того, у CSV повністю бракує можливості зберігати метадані або навіть тип даних стовпця - це призводить до декількох документів, які ви повинні прочитати, щоб не зрозуміти дані.


5
Так, є стандартні tools.ietf.org/html/rfc4180 і багато інших форматів не зберігають жодних метаданих, вони просто не призначені для зберігання метаданих - .txt файли також не зберігають метадані про текстові документи ...
Tim

4
Тім, цей стандарт ігнорується частіше, ніж ні, що робить його нестандартним ,,,
Крістіан Зауер

8
Чудова річ у стандартах полягає в тому, що їх так багато на вибір. (Різно мутовані та приписувані.)
Нік Кокс

4

Якщо ви зможете відкинути роздільник комами та використати символ вкладки, ви матимете набагато кращий успіх. Ви можете залишити файл з іменем .CSV і імпорт до більшості програм зазвичай не є проблемою. Просто імпортуйте файл з обмеженою таблицею, а не комами, коли ви імпортуєте файл. Якщо у ваших даних є коми, у вас виникнуть проблеми при введенні знаків з комою, як ви добре знаєте.


5
Якщо у ваших даних є вкладки, застосовується зворотна. Це просто, принаймні, на мій досвід, менш вірогідний.
Нік Кокс

@ Нік і Горіла: Я мав хороші результати |як роздільник домашніх текстових файлів записів у форматі CSV (із заголовками книг та іншими метаданими документа). |ніколи не трапляється в даних, з якими я працюю, тому я можу просто писати сценарії Perl, які просто розбиваються / з'єднуються, не перевіряючи цитування будь-якого виду. Це було для разового проекту, який включає лише обробку метаданих, збережених із бази даних MS Access. Для будь-якого масштабного проекту або якщо ви плануєте довго зберігати дані у цьому файловому форматі, виберіть щось більш надійне! Я завжди міг щось підправити, якби партія цього місяця щось зламала.
Пітер Кордес

@PeterCordes Я вірю вам, і все, що працює. Але очевидно, що вартість ідіосинкратичних роздільників може бути потребою пояснити їх іншим, і важливо, що вони можуть без проблем імпортувати такі файли даних. Зіткнувшись з незвичним форматом файлів, необхідно мати доступ до якоїсь рутини, функції або команди, яка може розділити рядки на довільні роздільники.
Нік Кокс

@PeterCordes Коли я написав splitкоманду для Stata, я подивився, серед іншого, еквівалент Perl, щоб побачити, що він робив, а що не робив. Не вихідний код, а лише пропонований функціонал.
Нік Кокс

1
@ NickCox: Багато функцій perl досить добре розроблені, IMO. Вони виконують роботу без особливих обмежень, таких як ви знайдете в awk (що часто добре) або esp. інші інструменти Unix подобається cut, sortі uniq.
Пітер Кордес

4

ASCII надає нам чотири символи "роздільника", як показано нижче у фрагменті зі сторінки "ascii (7) * nix man":

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

Ця відповідь дає гідний огляд їх наміченого використання.

Звичайно, у цих кодах управління бракує зручності для людей (читабельності та введення даних) у більш популярні роздільники, але вони є прийнятним вибором для внутрішнього та / або ефемерного обміну даними між програмами.


2
Цікаво. Я не думаю, що я ніколи не бачив, щоб вони використовувалися в дикій природі, хоча ...
Метт Крауз

4

Проблема не в комах; проблема - цитування. Незалежно від того, які роздільники записів та полів ви використовуєте, вам потрібно бути готовим до їх зустрічі у вмісті. Тож вам потрібен механізм цитування. І ТОТЕ вам потрібен спосіб для символів, що цитують, також з'являтися.

Дотримуючись стандарту RFC 4180, все простіше для всіх.

Мені особисто довелося написати сценарій, щоб, мабуть, виправити вихід з програми, яка помилилася, тому я трохи войовнича щодо цього. "ймовірно виправити" означає, що він працював для моїх даних, але я бачу ситуації, коли це не вдасться. (У захисті програми було написано перед стандартом.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.