2011-08-03 08:39:00 +0000 2011-08-03 08:39:00 +0000
64
64
Advertisement

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

Advertisement

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

, например:

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

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


EDIT: Уточните цель моего вопроса, извините за путаницу.

Advertisement
Advertisement

Ответы (5)

70
70
70
2011-08-03 08:39:57 +0000

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

"=""Data Here"""

, например…

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

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

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

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

(EDIT: Обновлено с исправлениями, спасибо DMA57361!).

39
39
39
2014-01-20 13:02:48 +0000

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

Для Excel 2007 идет следующее:

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

Однако:

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

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

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

Двойной щелчок по файлу csv может открыть файл как электронную таблицу в Excel, показывающую все значения, которые обрабатываются как раз выше, как текстовые данные. Убедитесь, что Excel использует в качестве десятичной точки ‘. ’, а не ‘, ’, иначе каждая строка csv-файла закончится как один текст в первой ячейке каждой строки. Очевидно, Microsoft считает, что CSV означает “Not the decimal point” Separated Value.

22
Advertisement
22
22
2011-08-03 09:13:56 +0000
Advertisement

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

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

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

2
2
2
2013-01-13 22:37:27 +0000

Пример Саймона не сработал для меня, и я подозреваю, что это языковая разница. В 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
Advertisement
-2
-2
2013-01-13 23:23:56 +0000
Advertisement

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

‘10/11/2002

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

Advertisement

Похожие вопросы

6
13
9
16
10
Advertisement
Advertisement