Есть ли способ включить запятые в столбцы CSV, не нарушая форматирование?


283

У меня есть два столбца CSV с именем и номером. Некоторые люди используют запятые, например. Joe Blow, CFA.Эта запятая нарушает формат CSV, поскольку она интерпретируется как новый столбец.

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

Мне бы очень хотелось оставить запятую (я знаю, что Excel поддерживает другие разделители, но другие интерпретаторы могут этого не делать). Я также хотел бы оставить запятую в имени, так как Joe Blow| CFAвыглядит довольно глупо.

Есть ли способ включить запятые в столбцы CSV, не нарушая форматирование, например, экранируя их?



Небольшой взлом, который сработал для меня: откройте файл CSV в текстовом редакторе, а затем вставьте его в документ Excel. Работает, если вы можете сделать это большими кусками.
Джонас

@Jonas: Excel не может угадать, используется ли один и тот же токен в качестве разделителя или части данных. Вставка из текстового редактора не меняет этого.
Инспектируемый

Ответы:


373

Заключите поле в кавычки, например

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 выигрывает.
Риного

16

Если вы хотите сделать то, что вы сказали, вы можете использовать кавычки. Что-то вроде этого

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

так что теперь вы можете использовать запятую в вашей переменной имени.


Спасибо Cloud за ваш совет, который сделал это: $whatever = "\"".$name."\"";
здесь

Спасибо за ваше решение.
Бхавин Туммар

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("""", """""")

Наконец, оберните значение элемента:

НА левом: с двойной кавычкой (")

ON RIGHT: с двойной кавычкой (") и запятой (,)

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

0

Двойные кавычки не работали для меня, это работало для меня \". Если вы хотите поместить двойные кавычки в качестве примера, вы можете установить \"\".

Вы можете построить формулы, например:

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

напишу в csv:

= ЕСЛИ (С3 = 1, "", В3)


0

Может быть, это не то, что нужно здесь, но это очень старый вопрос, и ответ может помочь другим. Совет, который я считаю полезным при импорте в Excel с другим разделителем, - это открыть файл в текстовом редакторе и добавить первую строку, например:

Сентябре = |

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

Панель управления> Часы и регион> Регион> Форматы> Дополнительно> Числа> Разделитель списка [смените запятую на предпочитаемую вами альтернативу]. Это означает, что Excel также будет по умолчанию экспортировать файлы CSV с использованием выбранного разделителя.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.