Чи є спосіб включити коми до стовпців CSV, не порушуючи форматування?


282

У мене є CSV з двома стовпцями з ім'ям та номером. Ім'я деяких людей використовує коми, наприклад, Joe Blow, CFA.ця кома порушує формат CSV, оскільки інтерпретується як новий стовпець.

Я прочитав, і найпоширеніший рецепт, здається, замінює цей символ або замінює роздільник на нове значення (наприклад this|that|the, other).

Я дуже хотів би зберегти роздільник комами (я знаю, що excel підтримує інші роздільники, але інші інтерпретатори можуть не робити). Я також хотів би зберегти кому в назві, як це Joe Blow| CFAвиглядає досить нерозумно.

Чи є спосіб включити коми до стовпців CSV, не порушуючи форматування, наприклад, уникаючи їх?



Маленький хак, який працював для мене: відкрийте файл csv в текстовому редакторі, а потім вставити в документ excel. Працює, якщо ви можете це зробити великими шматками.
Йонас

@Jonas: Excel не може здогадатися, чи використовується той же маркер як роздільник або частина даних. Вставка з текстового редактора цього не змінює.
IIнеочікуваний

Відповіді:


370

Закрийте поле лапками, наприклад

field1_value,field2_value,"field 3,value",field4, etc...

Дивіться вікіпедію .

Оновлено :

Щоб кодувати цитату, використовуйте ", один подвійний символ цитати в полі буде закодований як "", і все поле стане """". Отже, якщо ви бачите таке, наприклад, у Excel:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

файл CSV міститиме:

regular_value,",,,""",","""",","""""""",""""

Кома просто інкапсульована за допомогою лапок, так і ,стає ",".

Кома і цитата повинні бути капсульовані і цитуватися, так і ","стає """,""".


4
Це працювало для мене! Я експортував змінну js до CSV, і розміщення додаткової пари лапок навколо кожної рядки допомогло вирішити проблему "Джон Блоу, CFA", про яку говорилося в запитанні.
Мадхуліка Мукерджі

Що робити, якщо всередині кожної комірки є як лапки, так і коми?
швидкісний літак

2
Я оновив відповідь на кількох прикладах - коротше, коми вкладаються в лапки (наприклад ","), а цитати виходять (наприклад """)
Райан,

6
Тепер це має бути прийнятою відповіддю, оскільки воно пропонує чудове рішення, яке, ймовірно, вирішує 99% випадків використання.
BuZz

Чи є бібліотека C # для розбору файлів CSV із полями, що закрилися цитатами?
Мінь Тран

34

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

Довідковий специфікаційний документ .


10
RFC 4180, загальний формат і тип MIME для файлів, розділених комами (CSV), ietf.org/rfc/rfc4180.txt ; ще одна «офіційна» специфікація.
Ши

3
Включення найбільш широко прийнятого підходу зробило б це чудовою відповіддю. На даний момент відповідь @Ryan виграє.
rinogo

16

Якщо ви хочете зробити те, що ви сказали, можете використовувати лапки. Щось на зразок цього

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

тож тепер ви можете використовувати коми у змінній вашого імені.


Дякую Хмару за пораду, що це вдалося: $whatever = "\"".$name."\"";
було

Дякуємо за ваше рішення.
Bhavin Thummar

10

Вам потрібно навести ці значення.
Ось більш детальна специфікація.


2
Існує декілька специфікацій, Excel використовує лапки навколо запису, Linux використовує зворотній косий символ. На жаль, вам потрібно втекти за цільовою аудиторією / цільовою системою.
Руду

7

Крім пунктів в інших відповідях: одне, що слід зазначити, якщо ви використовуєте цитати в Excel, - це розміщення ваших пробілів. Якщо у вас є такий рядок коду:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excel буде розглядати початкову цитату як буквальну цитату, а не використовувати її для виходу з коми. Ваш код потрібно буде змінити на

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

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


3

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


2
А що б ви зробили, якби дані містили символи "+"?
Ендрю Мортон

1
@AndrewMorton Так, це виклик. Але в моєму випадку я впевнений, що +моїх даних взагалі немає. Дякую за добрий коментар.
Мухаммед

4
Простий та надійний спосіб - укласти рядки у подвійні лапки та уникнути подвійних лапок у рядках, використовуючи дві подібні "". Це звичайний спосіб зробити це.
Ендрю Мортон

1
Якщо це не працює, перевірте, що ви не створюєте пробіли поряд з вашими обмежувальними комами: "Жаба", "жовта, зелена" працюватимуть "Жаба", "жовта, зелена" не буде
Дазберт,

Особисто я знайшов @AndrewMorton другий коментар тут насправді допоміг мені зрозуміти, що робити краще, ніж прийнята відповідь. Крок 1 - уникнути подвійних лапок у полях даних, наприклад, у Python: field = field.replace('"', '""')Крок 2 - після кроку 1, укладіть саме поле у ​​подвійні лапки, наприклад field = '"' + field + '"'- тоді я думаю, що ви є чавунним.
Буде Кроксфорд

3

Залежно від вашої мови, може бути доступний метод to_json. Це дозволить уникнути багатьох речей, які порушують CSV.


3

Я виявив, що деякі програми, такі як Numbers в Mac, ігнорують подвійну цитату, якщо перед цим є місце.

a, "b,c"не працює, поки a,"b,c"працює.


1
Ви, мабуть, просто врятували мені годину роботи ... дякую!
Shaun314

1

Ви можете кодувати свої значення, наприклад, у PHP base64_encode ($ str) / base64_decode ($ str)

ІМО це простіше, ніж подвоєння котирувань тощо.

https://www.php.net/manual/en/function.base64-encode.php

Зашифровані значення ніколи не містять коми, тому кожна кома у вашому CSV буде роздільником.



0

Ви можете використовувати Text_Qualifierполе в Менеджері з’єднань з файловими файлами до ". Це має обгортати ваші дані в лапки та лише окремими комами, які знаходяться поза лапок.


0

По-перше, якщо значення елемента має подвійний символ цитати ("), замініть його двома символами подвійної цитати (" ")

item = item.ToString().Replace("""", """""")

Нарешті, оберніть значення елемента:

НА ЛІВО: З подвійним символом цитати (")

ВКЛЮЧЕНО: З символом подвійної цитати (") та символом кома (,)

csv += """" & item.ToString() & ""","

0

Подвійні цитати не працювали для мене, вони працювали для мене \". Якщо ви хочете розмістити подвійні лапки як приклад, ви можете встановити \"\".

Ви можете побудувати формули, наприклад:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

напишу в CSV:

= ЯКЩО (C3 = 1, "", B3)


0

Тут може бути не те, що потрібно, але це дуже старе питання, і відповідь може допомогти іншим. Порада, яку я вважаю корисною при імпорті в Excel з іншим роздільником, - це відкрити файл у текстовому редакторі та додати перший рядок, як:

sep = |

де | це роздільник, який ви хочете використовувати в Excel. Ви також можете змінити роздільник за замовчуванням у Windows, але трохи ненадовго:

Панель управління> Годинник та регіон> Регіон> Формати> Додаткові> Номери> Розділювач списку [перехід від коми через бажану альтернативу]. Це означає, що Excel також за замовчуванням експортує CSV, використовуючи вибраний роздільник.

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