Есть ли способ включить запятые в столбцы 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)