Форматування CSV, обмеженого комами, щоб змусити Excel інтерпретувати значення як рядок


61

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

наприклад:

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

Excel намагається "розумно" перетворити все це у свої рідні формати дати / числа. Чи є шлях до цього?


EDIT: Уточнив наміри мого питання, вибачте за плутанину.

Відповіді:


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"""



(EDIT: оновлено з виправленнями, дякую DMA57361!)


Дивовижно, нам просто потрібно змінити дані .. зітхання
PriceChild

4
Цей останній стовпець повинен бути "=""123"""інакше погано сформований. Поля, що містять "обов'язкове поле, повинні бути обмежені, а "s в полі уникнути інших "s.
DMA57361

@ DMA57361 насправді так, як у нього це є, це добре, в інших двох полях поруч із ним відсутній заздалегідь заданий знак рівності. Що він там помістив, це встановити формулу цієї комірки для повернення рядка. Щоб уникнути цього, ви можете встановити тип даних комірки на "Текст".
Прорив

2
@Перед цією таблицею представлений файл CSV, а не поля Excel. Останнє значення ="123"не є дійсним полем CSV, оскільки воно містить символ роздільника поля, " не правильно розмежуючи його чи поле. Факт, що Excel читає його як формулу, залежить лише від Excel і нічого спільного з файлом CSV.
DMA57361

2
@PriceChild, моїм початковим запитанням (яке я насправді не дуже добре пояснив) було насправді, як відформатувати CSV, щоб зробити його максимально простим для користувачів. І тому це відповідь, яку я знайшов і хотів опублікувати. DMA57361 насправді приніс корисну корекцію, дякую!
Simon Simon

33

Як і багато хто, я боровся з тими самими рішеннями, що приймає Microsoft, і випробував різні запропоновані рішення.

Для Excel 2007 йде наступне:

  • Введення всіх значень у подвійні лапки НЕ допомагає
  • Поставлення an = перед усіма значеннями після їх розміщення у подвійних квотах НЕ допомагає, але НЕ робить файл CSV непридатним для більшості інших програм
  • Розміщення дужок навколо подвійних лапок навколо всіх значень - сміття
  • Розміщення пробілу перед усіма значеннями перед тим, як ставити подвійні лапки навколо них, НЕ перешкоджає перетворенню дат, але НЕ перешкоджає обрізанню провідних або кінцевих нулів.
  • Поставлення єдиної лапки перед значенням працює лише під час введення даних у Excel.

Однак:

Якщо розмістити вкладку перед усіма значеннями перед тим, як ставити подвійні лапки навколо них, НЕ перешкоджає перетворенню дат І НЕ запобігає обрізанню провідних чи кінцевих нулів, а на аркуші навіть не з’являються неприємні маркери попередження у верхньому лівому куті кожної комірки.

Наприклад:

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

Зверніть увагу, що символ вкладки повинен містити подвійні лапки. Редагувати: виявляється, подвійні лапки навіть не потрібні.

Двічі клацнувши на файлі csv, можна відкрити його як електронну таблицю в Excel, показуючи всі значення, які трактуються як трохи вище, як текстові дані. Не забудьте встановити Excel використовувати "." як десяткова крапка, а не ',' або кожен рядок файлу csv закінчуватиметься як один текст у першій комірці кожного рядка. Мабуть, Microsoft вважає, що CSV означає розділене значення "Не десяткова крапка".


Цей фокус із вкладками врятував мені день, Excel перетворював дійсно довгі числові значення в цифри, а всі цифри втрачав після 15-го. Вдалося Excel розглянути їх як текст із префіксом вкладки. Так працює і для чисел, а не лише для побачень.
Markus Yrjölä

21

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

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

Ось зображення Майстра імпортування тексту Excel 2003 на прикладі наведених даних, показуючи мені імпорт останніх двох стовпців у вигляді тексту:

Excel 2003: майстер імпорту тексту на кроці 3 - типи даних


Відмінна відповідь DMA57361, дякую за всі деталі. Те, що я насправді не згадував у своєму запитанні, - це те, що я пишу сценарій, який експортує дані в Excel, тому я намагався не допустити, щоб користувачі переходили через такі заплутані варіанти. Але ви все одно проголосували. :-)
Simon East

@ Симоне, про що ти пишеш сценарій? Будь-який спосіб ви можете змусити його безпосередньо створювати фактичні файли Excel, а не проміжний формат?
DMA57361

це сценарій PHP, який експортує таблицю бази даних. CSV - це, мабуть, найпростіше працювати, але ви правильно, я міг би створити XLS за допомогою якихось кодів з відкритим вихідним кодом або навіть просто таблиці HTML, які, на мою думку, з минулого досвіду дають розумні результати в Excel (дозволяє кольори та форматування тощо, але не впевнені у типах даних).
Simon Simon

1
Є декілька запитань щодо ТА щодо PHP → Excel, перші кілька я спробував усі мають відповідь, що вказує на PHP Excel , так що, можливо, варто подивитися.
DMA57361

це дуже корисно, прочитавши досить багато
ансерів

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, у якому форматі має бути кожен стовпець. Погляньте на це запитання, яке я задав .


5
Зважаючи на це, НЕ працює у файлах CSV, які імпортуються в Excel. Excel трактує цитату як буквальну цитату і тому показує її у комірці.
psynnott
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.