Форматирование CSV с разделителями-запятыми, чтобы заставить Excel интерпретировать значение как строку

64

Некоторое время я искал, пытаясь выяснить, как вывести файл CSV таким образом, чтобы заставить Excel интерпретировать значения как строку, а не пытаться преобразовать их в числа или даты.

например:

"141", "10/11/2002", "350.00", "1311742251"

Excel пытается «разумно» преобразовать все это в свои родные форматы даты / числа. Есть ли способ обойти это?


РЕДАКТИРОВАТЬ: разъяснил смысл моего вопроса, извините за путаницу.

Саймон Ист
источник

Ответы:

67

Для тех, кто имеет контроль над исходными данными, очевидно, что Excel будет автоматически определять формат поля CSV, если столбец CSV не находится в этом формате:

"=""Data Here"""

например...

20,       5.5%,      "0404 123 351", "3-6",  "=""123"""
[number]  [percent]  [number]        [date]  [string]  <-- how Excel interprets

Он также работает в Google Spreadsheet, но не уверен, что другие приложения для работы с электронными таблицами поддерживают эту нотацию.

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

"=""She said """"Hello"""" to him"""



(РЕДАКТИРОВАТЬ: Обновлено с исправлениями, спасибо DMA57361!)

Саймон Ист
источник
Круто, нам просто нужно изменить данные .. вздох
Дорогой
4
Этот последний столбец должен быть в "=""123"""противном случае он плохо сформирован. Поля, содержащие a, "должны быть разделены, а "s в поле экранировано другими "s.
DMA57361
@ DMA57361 на самом деле, у него все хорошо, в двух других полях рядом с ним пропущен знак равенства. То, что он положил туда, это установление формулы этой ячейки для возврата строки. Чтобы избежать этого, вы можете установить тип данных ячейки «Текст».
Прорыв
2
@ Через эту таблицу там представлен файл CSV, а не поля Excel. Последнее значение ="123"не является допустимым полем CSV, так как оно содержит символ разделителя полей " без правильного разграничения его или поля. Дело в том, что Excel считал его формулой исключительно для Excel и не имеет ничего общего с CSV-файлом.
DMA57361
2
@PriceChild, смысл моего первоначального вопроса (который я не очень хорошо объяснил) заключался в том, как отформатировать CSV, чтобы сделать его максимально простым для пользователей. И вот этот ответ я нашел себе и хотел опубликовать. DMA57361 на самом деле тоже принесла полезную поправку, спасибо!
Саймон Ист
36

Как и многие, я боролся с теми же решениями, которые принимает Microsoft, и пробовал различные предлагаемые решения.

Для Excel 2007:

  • Помещение всех значений в двойные кавычки НЕ помогает
  • Помещение = перед всеми значениями после их двойных кавычек помогает, НО делает файл csv бесполезным для большинства других приложений
  • Скобки вокруг двойных кавычек вокруг всех значений - мусор
  • Помещение пробела перед всеми значениями перед двойными кавычками препятствует преобразованию в даты, но НЕ препятствует обрезанию начальных или конечных нулей.
  • Помещение одинарной кавычки перед значением работает только при вводе данных в Excel.

Тем не мение:

Помещение табуляции перед всеми значениями перед тем, как заключить в них двойные кавычки, препятствует преобразованию в даты и препятствует обрезанию начальных или конечных нулей, и на листе даже не отображаются неприятные предупреждающие маркеры в верхнем левом углу каждой ячейки.

Например:

"<tab character><some value>","<tab character><some other value>"

Обратите внимание, что символ табуляции должен быть в двойных кавычках. Редактировать: оказывается, что двойные кавычки даже не нужны.

Двойной щелчок по файлу csv может открыть файл в виде электронной таблицы в Excel, показывающей все значения, которые обрабатываются как выше, как текстовые данные. Убедитесь, что в Excel установлено «.» в качестве десятичной точки, а не ',' или каждая строка файла CSV будет заканчиваться как один текст в первой ячейке каждой строки. По-видимому, Microsoft считает, что CSV означает «не десятичная точка» разделенное значение.

ajabo
источник
Этот трюк с вкладками спас мой день, Excel преобразовывал действительно длинные числовые значения в числа и потерял все цифры после 15го числа. Удалось заставить Excel обрабатывать их как текст с префиксом табуляции. Так что работает для чисел, а не только даты.
Маркус
Это действительно полезно, спасибо!
Флавио
22

Использование функции импорта в Excel позволяет указать формат (авто, текст или дату), который должен интерпретироваться для каждого столбца и не требует каких-либо изменений в файлах данных.

Вы можете найти его как DataGet External DataFrom Textв Excel 2007/2010.
Или DataImport External DataImport Dataв Excel 2003.

Вот изображение мастера импорта текста в Excel 2003 в действии с данными примера, показывающее, как импортировать последние два столбца в виде текста:

Excel 2003: мастер импорта текста на шаге 3 - типы данных

DMA57361
источник
Отличный ответ DMA57361, спасибо за все детали. Что я действительно не упомянул в своем вопросе, так это то, что я пишу скрипт, который экспортирует данные в Excel, поэтому я пытался не дать пользователям перепрыгивать через запутанные опции, подобные этой. Но все равно проголосовал за тебя. :-)
Саймон Ист
@ Симон, для чего ты пишешь сценарий? Каким-либо образом вы можете получить его для непосредственного создания реальных файлов Excel вместо промежуточного формата?
DMA57361
это скрипт PHP, который экспортирует таблицу базы данных. С CSV, вероятно, проще всего работать, но вы правы, я мог бы, вероятно, создать XLS с помощью некоторого кода с открытым исходным кодом или даже просто таблицы HTML, которая, как мне кажется из прошлого опыта, дает разумные результаты в Excel (позволяет цвета и форматирование и т. д., но не уверен насчет типов данных).
Саймон Ист
1
Есть несколько вопросов о SO → PHP → Excel, первые несколько, которые я попробовал, имеют ответ, указывающий на PHP Excel , так что это может стоить посмотреть.
DMA57361
это очень полезно, после того, как вы прочитали немало ансеров
greg121
1

Пример от Саймона у меня не сработал, и я подозреваю, что это языковая разница. В C # вот как выглядит строка моего рабочего формата:

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);

и вот как выглядит выходной файл:

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""

Как можно видеть, формат в выходном файле ="VALUE",не тот, "=""VALUE""",который, я считаю, может быть соглашением Visual Basic.

Я использую Excel 2010. Кстати, Google Sheets не будет открывать / конвертировать файл, отформатированный таким образом. Это будет работать, если вы удалите знак равенства таким образом "VALUE",- Excel все равно откроет файл, но проигнорирует тот факт, что вы хотите, чтобы ваши столбцы были строками.

Шейн
источник
-2

Простой способ заставить Excel интерпретировать дату как текст - это поставить одну кавычку перед датой, вместо использования полных кавычек, как в:

'10 / 11/2002

Если вы можете импортировать CSV вместо его открытия, вы можете указать Excel, в каком формате должен быть каждый столбец. Посмотрите на этот вопрос, который я задал .

hdhondt
источник
5
Понижено из-за того, что это НЕ работает в файлах CSV, импортируемых в Excel. Excel интерпретирует цитату как буквальную кавычку и поэтому показывает ее в ячейке.
psynnott