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

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

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

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

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

Ответ 1

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

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

Смотрите википедию.

Обновлено:

Чтобы кодировать кавычку, используйте ", один символ двойной кавычки в поле будет закодирован как "", и все поле станет """". Так что если вы видите следующее, например, в Excel:

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

CSV файл будет содержать:

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

Запятая просто инкапсулируется с помощью кавычек, так , становится ",".

Запятая и кавычка должны быть заключены в кавычки и заключены в кавычки, поэтому "," становится """,""".

Ответ 2

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

Справочный документ

Ответ 3

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

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

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

Ответ 4

Вы должны указать эти значения.
Здесь - более подробная спецификация.

Ответ 5

В дополнение к точкам в других ответах: одно замечание, если вы используете кавычки в 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)

Именно эта тонкость привела меня сюда.

Ответ 6

Я столкнулся с той же проблемой, и цитирование , не помогло. В конце концов я заменил , на +, завершил обработку, сохранил вывод в outfile и заменил + на ,. Это может показаться уродливым, но это сработало для меня.

Ответ 7

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

ИМО это проще, чем удваивать цитаты и т.д.

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

Закодированные значения никогда не будут содержать запятую, поэтому каждая запятая в вашем CSV будет разделителем.

Ответ 8

Вы можете использовать поле Text_Qualifier в вашем диспетчере соединений с плоскими файлами как ". Это должно обернуть ваши данные в кавычки и только разделять запятыми, которые находятся вне кавычек.

Ответ 9

Во-первых, если значение элемента имеет символ двойной кавычки ( "), замените на 2 символа двойной кавычки (" ")

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

Наконец, значение item item:

ON LEFT: с символом двойной кавычки (")

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

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

Ответ 10

В зависимости от вашего языка может быть доступен метод to_json. Это позволит избежать многих вещей, которые нарушают CSV.

Ответ 11

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

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

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

напишу в csv:

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