Остановить Excel от автоматического преобразования определенных текстовых значений в даты


526

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

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


120
Да, например, когда файл с 10000 именами пользователя имеет имя типа «april25», оно преобразуется в дату и в конечном итоге обрабатывается как «apr-25», что приводит к ошибке «username not found», потому что вы этого не сделали ожидайте, что Excel преобразует одно значение в дату, 4000 записей в файл, оставляя остальной текст. Какой хромой код для чтения CSV; действительно, разве не предполагается угадывать тип, основанный на первых X записях, и придерживаться его? Или оставьте все это текстом. Если я хочу, чтобы он был отформатирован как «общий», я могу выбрать это позже. Принимая «общее» с самого начала, это рискует повредить текстовые данные.
Трийнко

У меня была проблема при копировании и вставке. Для всех поисков решения выберите целевой столбец, установите для него строковый / текстовый формат, затем скопируйте источник и выполните специальную вставку (щелчок правой кнопкой мыши) с «только значениями». Сохраняет значения, без форматирования даты.
Кай Ноак

84
Я просто хочу добавить, что считаю это поведение Excel серьезным недостатком. Как насчет всех людей, которые не могут позволить себе изменить содержимое файла CSV до импорта в Excel? Или как насчет людей, которые не понимают эту проблему до тех пор, пока не внесут множество других изменений в файл CSV? Это делает работу с файлами CSV в Excel беспорядочной.
Робиннес

Вы используете DatatableJS? Потому что я уже знаю, как сделать это с этим API. Если вам это нужно, вы можете найти его здесь: stackoverflow.com/a/36142043/4241058
Ричард Ребеко

11
Все эти решения для использования File -> Open -> Import работают хорошо для нас, потому что мы знаем, что делаем, но бесполезно для других 99,5% мира, которые не понимают навигации по файловой системе из / в / an применение. Они видят файл, чтобы использовать его, дважды щелкают по нему. Я провел 25 лет, обучая людей тому, как использовать офисные приложения и писать код, который генерирует данные для упомянутых офисных приложений, и использование / application / для поиска используемого файла выходит далеко за рамки почти всех.
user2624417

Ответы:


355

Я обнаружил, что, поставив '=' перед двойными кавычками, вы достигнете желаемого. Это заставляет данные быть текстовыми.

например. = "2008-10-03", = "больше текста"

РЕДАКТИРОВАТЬ (согласно другим постам) : из-за ошибки в Excel 2007, отмеченной Джеффькинсом, следует использовать решение, предложенное Эндрю :"=""2008-10-03"""


12
Я принимаю этот ответ, потому что 1) мой CSV-файл будет использоваться только Excel, и 2) это для учета и не может иметь 'в начале, и 3) я не хочу, чтобы они делали импорт. Я просто хочу, чтобы они открыли CSV.

5
Большой! Но из-за 2007 ошибки Excel использовать решение , предложенное Эндрю : "=""2008-10-03""". Обновил пост.
TMS

1
Это не работает для меня в Excel 2010, если текст слишком длинный :(
Стив

7
Это работает потому, что когда Excel видит символ «=», он решает оценить выражение, следующее за ним. В этом случае выражение является просто строковым литералом, а значение строкового литерала является содержимым строки. Таким образом, кавычки волшебным образом исчезают. Вы можете поставить = 1 + 2 + 3 и получить значение 6 после импорта CSV. Сама формула не уничтожается в процессе импорта.
Локори

4
С этим подходом возникает большая проблема - если вы откроете файл в Excel и отредактируете, а затем сохраните и снова откроете все эти «исчезновения»
ACV

150

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

Проблема заключается не только в датах в текстовых полях, но и в том, что числовое преобразовывается из текста в числа. Несколько примеров, где это проблематично:

  • Почтовые индексы
  • телефонные номера
  • правительственные идентификационные номера

который иногда может начинаться с одного или нескольких нулей (0), которые выбрасываются при преобразовании в числовое значение. Или значение содержит символы, которые можно спутать с математическими операторами (как в датах: /, -).

Два случая, о которых я могу подумать, что решение «prepending =», как упоминалось ранее, может быть не идеальным ,

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

Мой хак, чтобы обойти это

Если к значению предварительно / добавляется нецифровый и / или не датированный символ, значение будет распознано как текст и не будет преобразовано. Непечатный символ будет хорош, поскольку он не изменит отображаемое значение. Однако обычный старый пробел (\ s, ASCII 32) не работает для этого, так как он отсекается в Excel, а затем значение все равно преобразуется. Но есть различные другие печатные и непечатные символы, которые будут хорошо работать. Самый простой , однако это Append (добавить после) простой символ табуляции (\ т, ASCII 9).

Преимущества такого подхода:

  • Доступно с клавиатуры или с легко запоминающимся кодом ASCII (9),
  • Это не беспокоит импорт,
  • Обычно не беспокоит результаты слияния (в зависимости от макета шаблона - но обычно он просто добавляет широкий пробел в конце строки). (Если это, однако, проблема, посмотрите на другие символы, например пробел нулевой ширины (ZWSP, Unicode U + 200B)
  • не является большой помехой при просмотре CSV в блокноте (и т. д.),
  • и может быть удален путем поиска / замены в Excel (или Блокнот и т. д.).
  • Вам не нужно импортировать CSV, но можно просто дважды щелкнуть, чтобы открыть CSV в Excel.

Если есть причина, по которой вы не хотите использовать вкладку, найдите в таблице Unicode что-то еще подходящее.

Другой вариант

может быть для создания файлов XML, для которых определенный формат также принимается для импорта более новыми версиями MS Excel, и который позволяет намного больше параметров, подобных формату .XLS, но у меня нет опыта в этом.

Так что есть разные варианты. В зависимости от ваших требований / приложения одно может быть лучше другого.


прибавление

Нужно сказать, что более новые версии (Excel 2013+) MS Excel больше не открывают CSV в формате электронных таблиц - еще один ускоренный удар в рабочем процессе, делающий Excel менее полезным ... По крайней мере, существуют инструкции для его обхода. Смотрите, например, этот Stackoverflow: Как правильно отображать файлы .csv в Excel 2013? ,


6
Я получил правильные ведущие нули после добавления \t к своему разделительному символу ;... черт возьми, MS Office, почему это заняло у меня больше 2 минут, чтобы понять?
Мортен Дженсен

2
Добавление \ t в конце всех значений действительно помогает. Это обходной путь, но на практике он работает нормально. Я предпочитаю это трюку с формулой с равным '=', потому что с первым может быть сложно работать в других инструментах.
окрокет

3
Недостаточно голосов, которые могли бы выразить вам мою благодарность. Поиск и замена в notepad ++ ',' to '\ t, \ t' (в том числе для первого и последнего столбцов) работает как шарм. Спасибо.
Асаф

1
В моем запросе MySQL (для вывода CSV через PHP) я использовал CONCAT ('\ t', column_name). Также сделал трюк. Спасибо!
Просто Обычная Высокая

1
Отличная идея. Увы, Numbers немного «умнее», чем Excel, и не попадает под хитрость табуляции. Лучшая альтернатива, которую я могу придумать, - это ведущая ', так как она довольно хорошо понята и не слишком отвлекает ... но невидимая будет лучше.
Хит Рэфтери

101

Отрабатывая решение Джарода и проблему, поднятую Джеффкинсом, вы можете изменить

"May 16, 2011"

в

"=""May 16, 2011"""

6
Не работает в Excel 2010, если текст длиннее определенной длины.
Стив

1
@Andrew, это «исправление» вызовет проблемы, если вам нужно иметь "значения где-то между датой.
Pacerier

8
К вашему сведению, если вы сохраните файл Excel,
символ

Мой опыт не соответствует ни Стиву, ни d512. Это работает для меня во входящем .csv в Excel 2013, и после сохранения как .xlsx это не возвращается. Достаточно просто для того, чтобы каждый мог проверить, используя эту строку данных: "806676", "Нет", "41", "=" "16 мая 2011" "", "100.00", "False"
tbc0

1
@ tbc0 Попробуйте "806676","None","41","=""05-16-2011""","100.00","False"вместо этого, и вы увидите, что при сохранении и перезагрузке теряется перенос текста.
NetMage

65

У меня была похожая проблема, и это обходной путь, который помог мне без необходимости редактировать содержимое файла CSV:

Если у вас есть возможность присвоить файлу имя, отличное от «.csv», вы можете назвать его с расширением «.txt», например «Myfile.txt» или «Myfile.csv.txt». Затем, когда вы откроете его в Excel (не перетаскивая, а используя File-> Open или список наиболее часто используемых файлов), Excel предоставит вам «Мастер импорта текста».

На первой странице мастера выберите «С разделителями» для типа файла.

На второй странице мастера выберите «,» в качестве разделителя, а также выберите классификатор текста, если вы заключили значения в кавычки

На третьей странице выберите каждый столбец отдельно и назначьте каждому тип «Текст» вместо «Общий», чтобы Excel не связывался с вашими данными.

Надеюсь, это поможет вам или кому-то с подобной проблемой!


2
О, кстати, я не первый, кто обнаружил это. isingline.com/use-excel-read-csv-without-reformatting.php На этой веб-странице также есть полезная инструкция, по которой вы можете щелкнуть по столбцам на третьей странице мастера, чтобы выбрать их все вместе, прежде чем назначать каждому тип "Текст".
rainerbit

Это может работать для значений даты, но, похоже, не работает для вещей, которые Excel интерпретирует как числовые. Если ваша строка содержит все числа и запятые, формат «Текст» будет научным форматом чисел.
Майкл - Где Клэй Ширки

3
это отлично сработало для меня и не повлекло за собой никаких изменений в моем файле, кроме как переименовать его в .txt. благодарю вас.
Кевин

1
К сожалению, Excel позволяет делать это только для первых 6 столбцов. Если вам нужно больше, лучшим подходом является копирование содержимого csv, создание и очистка файла Excel, выделение всех столбцов / строк и установка типа «Текст», затем вставка содержимого и использование Data | Текст в столбцы
nachocab

Это лучшее решение и должно быть отмечено как ответ.
Роб

28

ПРЕДУПРЕЖДЕНИЕ. В Excel '07 (по крайней мере) есть (еще одна) ошибка: если в содержимом поля есть запятая, он неправильно анализирует = "field, contents", а помещает все после запятой в Следующее поле, независимо от кавычек.

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

Это может означать, что есть некоторые поля, которые невозможно представить точно «правильно» в Excel, но сейчас я надеюсь, что никто не слишком удивлен.


Я только что проверил это в Excel 2007, и он работает правильно для меня. Однако, если перед кавычками есть начальный пробел, он не будет правильно обрабатывать запятую.
Sunny88

8
Это не будет ошибкой в ​​соответствии с RFC 4180. Правильный способ заключить в кавычки поле - заключить в кавычки все поле, а затем двойные кавычки внутренних кавычек. Итак, "=" "field, content" "" tools.ietf.org/html/rfc4180
Питер Стивенс

2
@PeterStephens, это не работает, если field, contentесть "внутри. Например"=""field, co""ntent"""
Pacerier

1
@Pacerier Вероятно, встроенная кавычка должна быть заключена в двойные кавычки, превращаясь в """".
ErikE

Я могу подтвердить, что предложение @ ErikE верно. Для поля со значением 1"2, если вы решите использовать этот трюк (вместо того, чтобы просто оставить его как "1""2"в файле - Excel уже обработал бы это как текст), тогда последняя правильная строка в CSV-файле с таргетингом на Excel заканчивается быть "=""1""""2""".
Дао

22

При создании строки для записи в мой CSV-файл на C # мне пришлось отформатировать ее следующим образом:

"=\"" + myVariable + "\""

2
это проснулось для меня и в Rails. Спасибо
Vieenay Siingh

3
Также работает на Java
Shoyo

Работал для меня в JavaScript с использованием Papa Parse.
wobsoriano

17

2018

Единственное правильное решение, которое сработало для меня (а также без изменения CSV ).

Excel 2010:

  1. Создать новую рабочую книгу
  2. Данные> Из текста> Выберите файл CSV
  3. Во всплывающем окне выберите переключатель «Разграничить», затем нажмите «Далее>»
  4. Флажки разделителей: отметьте только «Запятая» и снимите флажки с других параметров, затем нажмите «Далее>»
  5. В «Предварительном просмотре данных» перейдите в крайнее правое положение, затем удерживайте Shift и щелкните по последнему столбцу (это выберет все столбцы). Теперь в «Формате данных столбца» выберите переключатель «Текст», затем нажмите «Готово».

Excel office365: (версия клиента)

  1. Создать новую рабочую книгу
  2. Данные> Из текста / CSV> Выберите файл CSV
  3. Обнаружение типа данных> не обнаруживать

Примечание: Excel Office365 (веб-версия), так как я пишу это, вы не сможете это сделать.


3
Это работает без предварительного изменения файлов CSV, поэтому я думаю, что это должен быть правильный ответ.
Джек,

Это выглядит как правильный ответ. У меня были большие надежды. Но в MacOS (office365) я не могу выбрать ВСЕ столбцы: горизонтальная прокрутка в окне предварительного просмотра, отображаемом в мастере импорта текста, отсутствует, так что я могу выбрать только видимые столбцы. Я пробовал короткие пути (CMD + A или другие), но безрезультатно. Опция «не обнаруживать» также не существует. Я опустошен.
норманиус

Excel Office 365, выберите Файл, Параметры, Данные. Есть флажки, чтобы отобразить мастера импорта устаревших данных, если это необходимо.
Курт Шульц

15

В Excel 2010 откройте новый лист. На ленте данных нажмите «Получить внешние данные из текста». Выберите файл CSV и нажмите «Открыть». Нажмите кнопку "Далее". Снимите флажок «Tab», поставьте галочку рядом с «Comma», затем нажмите «Next». Нажмите в любом месте первого столбца. Удерживая клавишу Shift, перетащите ползунок до тех пор, пока вы не нажмете последний столбец, затем отпустите клавишу Shift. Нажмите кнопку «Текст», затем нажмите «Готово».

Все столбцы будут импортированы как текст, как они были в файле CSV.


1
Я столкнулся с той же проблемой, но тщательно следуя инструкциям @ Роба, все получилось бы идеально !. Спасибо
Милакей

2
Помощник Data From Text, к сожалению, не поддерживает многострочные ячейки. Если такой многострочный текст встречается, он записывает все строки после первой в новые строки, разбивая весь импорт. Он только правильно интерпретирует разрывы строк, если открыть файл CSV двойным щелчком мыши. Черт возьми, Microsoft ...
CodeManX

1
К сожалению, это не решает проблему случайного форматирования «справки» в Excel - текст DEC1 по-прежнему изменяется на дату дек-01. То же самое с текстом YYYY-MM-DD, переключаемым на DD / MM / YYYY. :(
Baracus

12

Все еще проблема в выпуске Microsoft Office 2016, довольно тревожная для тех из нас, кто работает с именами генов, такими как MARC1, MARCH1, SEPT1 и т. Д. Решение, которое я нашел наиболее практичным после генерации файла .csv в R, затем он будет открыт / открыт для пользователей Excel:

  1. Откройте файл CSV как текст (блокнот)
  2. Скопируйте его (Ctrl + A, Ctrl + C).
  3. Вставьте его в новый лист Excel - он будет вставлен в один столбец как длинные текстовые строки.
  4. Выберите / выберите этот столбец.
  5. Зайдите в Данные- «Текст в столбцы ...», в открывшемся окне выберите «Разграничить» (далее). Убедитесь, что «запятая» помечена (пометка, что она уже показывает разделение данных на столбцы ниже) (далее), в этом окне вы можете выбрать нужный столбец и пометить его как текст (вместо общего) (Готово).

НТН


Ручное усилие также не привлекало меня. Однако, после исчерпания всех имеющихся возможностей, эта была самой надежной и надежной.
Ана Мария Мендес-Перейра

Пакетная обработка тем не менее.
Ана Мария Мендес-Перейра

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

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

10

Вот простой метод, который мы используем при работе при создании файла csv, он немного изменяет значения, поэтому он не подходит для всех приложений:

Добавить пробел ко всем значениям в CSV

Это пространство будет удалено из чисел, таких как «1», «2.3» и «-2.9e4», но останется в датах, таких как «01/10/1993», и в логических значениях, таких как «TRUE», останавливая их преобразование в внутренние типы данных Excel.

Он также предотвращает защелкивание двойных кавычек при чтении, поэтому надежный способ создания текста в CSV-файле остается неизменным в Excel. ДАЖЕ, если какой-то текст наподобие «3.1415», заключает его в двойные кавычки И ставит перед пробелом всю строку, то есть (используя одинарные кавычки, чтобы показать, что вы вводите) '"3.1415"'. Тогда в Excel у вас всегда будет исходная строка, за исключением того, что она заключена в двойные кавычки и начинается с пробела, поэтому вам нужно учитывать их в любых формулах и т. Д.


Это сработало для меня. У меня были некоторые значения, такие как 1-1-1, которые автоматически конвертируются в даты. Как уже упоминалось, пространство будет передаваться, так что значение будет изменено, но я разбираю его при разборе, так что для меня это не имеет большого значения.
Джеклин

Пробел больше не работает, чтобы предотвратить интерпретацию даты или удаление начальных нулей. Но "\xA0"вместо этого вы можете использовать неразрывный пробел - это сработает.
Doin

8

(Предполагая Excel 2003 ...)

При использовании мастера преобразования текста в столбцы на шаге 3 можно указать тип данных для каждого из столбцов. Нажмите на столбец в окне предварительного просмотра и измените неправильный столбец с «Общие» на «Текст».


8
Это отличный выбор, если бы я мог заставить пользователя использовать процесс импорта.

Это на самом деле не помогает решить проблему, так как числа в столбце TEXT будут преобразованы в NUMBERS при экспорте в .csv в любом случае ...
Chonez

8

Это единственный способ, которым я знаю, как сделать это, не путаясь внутри самого файла. Как и в случае с Excel, я узнал об этом, часами стуча головой по столу.

Измените расширение файла .csv на .txt; это остановит Excel от автоматического преобразования файла при его открытии. Вот как я это делаю: откройте Excel на пустой лист, закройте пустой лист, затем File => Open и выберите файл с расширением .txt. Это заставит Excel открыть «Мастер импорта текста», где он задаст вам вопросы о том, как вы хотите, чтобы он интерпретировал файл. Сначала вы выбираете разделитель (запятая, табуляция и т. Д.), Затем (вот важная часть) вы выбираете набор столбцов столбцов и выбираете форматирование. Если вы хотите именно то, что находится в файле, выберите «Текст», и Excel отобразит только то, что находится между разделителями.


Это отлично сработало для меня в 2015-03-03 при работе с Excel для Mac 2011 (версия 14.4.8 150116), работе с данными в вопросе SO awk- избегайте переформатирования значений , похожих на даты , где проблема скорее в Excel чем awk, несмотря на название вопроса.
Джонатан Леффлер

4

(EXCEL 2007 и позже)

Как заставить Excel не «определять» форматы даты без редактирования исходного файла

Или:

  • переименовать файл как .txt
  • Если вы не можете этого сделать, вместо открытия CSV-файла непосредственно в Excel создайте новую рабочую книгу, затем перейдите
    Data > Get external data > From Text
    и выберите свой CSV.

В любом случае вам будут предложены параметры импорта, просто выберите каждый столбец, содержащий даты, и скажите Excel, чтобы форматировать как «текст», а не «общий».


4

То, что я сделал для этой же проблемы, было добавить следующее перед каждым значением CSV: "=" "" и одну двойную кавычку после каждого значения CSV, прежде чем открывать файл в Excel. Возьмите следующие значения, например:

012345,00198475

Они должны быть изменены перед открытием в Excel, чтобы:

"="""012345","="""00198475"

После этого каждое значение ячейки отображается в виде формулы в Excel и поэтому не будет отформатировано как число, дата и т. Д. Например, значение 012345 выглядит как:

="012345"

Другой подход заключается в сохранении числа в CSV как 1234500198475E-8; Таким образом, дальнейшие вычисления в Excel будут по-прежнему возможны.
Берт Брюноог

4

Ни одно из предложенных здесь решений не является хорошим решением. Это может работать для отдельных случаев, но только если вы контролируете окончательное отображение. Возьмите мой пример: моя работа составляет список продуктов, которые они продают в розницу. Это в формате CSV и содержит коды деталей, некоторые из них начинаются с нуля, установленных производителями (не под нашим контролем). Уберите начальные нули, и вы действительно сможете найти другой продукт. Розничные клиенты хотят получить список в формате CSV из-за внутренних программ обработки, которые также находятся вне нашего контроля и отличаются для каждого клиента, поэтому мы не можем изменить формат файлов CSV. Без префикса '=' и вкладок. Данные в сырых файлах CSV верны; когда клиенты открывают эти файлы в Excel, начинаются проблемы. И многие клиенты не очень разбираются в компьютерах. Они могут просто открыть и сохранить вложение электронной почты. Мы думаем о предоставлении данных в двух немного разных форматах: один как Excel Friendly (используя предложенные выше варианты, добавив TAB, другой как «master». Но это может быть желательным, так как некоторые клиенты не поймут, почему мы должны сделать это. Тем временем мы продолжаем объяснять, почему они иногда видят «неправильные» данные в своих электронных таблицах. Пока Microsoft не внесет надлежащие изменения, я не вижу надлежащего решения этого вопроса, пока никто не контролирует то, как конечные пользователи использовать файлы. Но это может быть желаемое за действительное, так как некоторые клиенты не поймут, почему мы должны это делать. Тем временем мы продолжаем объяснять, почему они иногда видят «неправильные» данные в своих таблицах. До тех пор, пока Microsoft не внесет надлежащие изменения, я не вижу правильного решения, пока кто-то не контролирует, как конечные пользователи используют файлы. Но это может быть желаемое за действительное, так как некоторые клиенты не поймут, почему мы должны это делать. Тем временем мы продолжаем объяснять, почему они иногда видят «неправильные» данные в своих таблицах. До тех пор, пока Microsoft не внесет надлежащие изменения, я не вижу правильного решения, пока кто-то не контролирует, как конечные пользователи используют файлы.


Если дополнительное пространство слева от ваших данных не имеет значения, вы можете исправить проблемы с Excel, добавив "\xA0"(без пробелов) к вашим данным.
Doin

3

Я на этой неделе встретился с этим соглашением, которое, кажется, является отличным подходом, но я нигде не могу найти на него ссылку. Кто-нибудь знаком с этим? Можете ли вы привести источник для этого? Я не искал часы и часы, но я надеюсь, что кто-то признает этот подход.

Пример 1: = ("012345678905") отображается как 012345678905

Пример 2: = ("1954-12-12") отображается как 1954-12-12 , а не 12.12.1954 .


2

Это не Excel. Windows распознает формулу, данные как дату и автокорректирует. Вы должны изменить настройки Windows.

«Панель управления» (-> «Переключиться на классический вид») -> «Региональные и языковые параметры» -> вкладка «Региональные параметры» -> «Настроить ...» -> вкладка «Числа» -> А затем изменить символы в соответствии с тем, что вы хотите.

http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html

Он будет работать на вашем компьютере, если эти настройки не будут изменены, например, на компьютере ваших клиентов, они будут видеть даты вместо данных.


2

Привет у меня та же проблема,

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

Таким образом, вы создаете файл .vbs с кодом ниже (например, Modify_CSV.vbs), сохраняете и закрываете его. Перетащите исходный файл в файл VBScript. Он создаст новый файл с «SPACE_ADDED» для имени файла в том же месте.

Set objArgs = WScript.Arguments

Set objFso = createobject("scripting.filesystemobject")

dim objTextFile
dim arrStr ' an array to hold the text content
dim sLine  ' holding text to write to new file

'Looping through all dropped file
For t = 0 to objArgs.Count - 1
    ' Input Path
    inPath = objFso.GetFile(wscript.arguments.item(t))

    ' OutPut Path
    outPath = replace(inPath, objFso.GetFileName(inPath), left(objFso.GetFileName(inPath), InStrRev(objFso.GetFileName(inPath),".") - 1) & "_SPACE_ADDED.csv")

    ' Read the file
    set objTextFile = objFso.OpenTextFile(inPath)


    'Now Creating the file can overwrite exiting file
    set aNewFile = objFso.CreateTextFile(outPath, True) 
    aNewFile.Close  

    'Open the file to appending data
    set aNewFile = objFso.OpenTextFile(outPath, 8) '2=Open for writing 8 for appending

    ' Reading data and writing it to new file
    Do while NOT objTextFile.AtEndOfStream
        arrStr = split(objTextFile.ReadLine,",")

        sLine = ""  'Clear previous data

        For i=lbound(arrStr) to ubound(arrStr)
            sLine = sLine + " " + arrStr(i) + ","
        Next

        'Writing data to new file
        aNewFile.WriteLine left(sLine, len(sLine)-1) 'Get rid of that extra comma from the loop


    Loop

    'Closing new file
    aNewFile.Close  

Next ' This is for next file

set aNewFile=nothing
set objFso = nothing
set objArgs = nothing

2

Без изменения вашего CSV-файла вы можете:

  1. Измените параметр «Формат ячеек Excel» на «текст»
  2. Затем с помощью «мастера импорта текста», чтобы определить ячейки CSV.
  3. После импорта удалите эти данные
  4. затем просто вставьте как обычный текст

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

Что-то вроде глупой работы, но это лучше, чем модифицировать данные CSV перед импортом. Энди Бэйрд и Ричард вроде как ускользнули от этого метода, но пропустили пару важных шагов.


1

Я знаю, что это старая тема. Для тех, кто, как я, у которых все еще есть эта проблема при использовании Office 2013 через PowerSuff-объект com, можно использовать метод opentext . Проблема в том, что этот метод имеет много аргументов, которые иногда взаимоисключающие. Чтобы решить эту проблему, вы можете использовать метод invoke-namedparameter, представленный в этом посте . Примером будет

$ex = New-Object -com "Excel.Application"
$ex.visible = $true
$csv = "path\to\your\csv.csv"
Invoke-NamedParameter ($ex.workbooks) "opentext" @{"filename"=$csv; "Semicolon"= $true}

К сожалению, я только что обнаружил, что этот метод каким-то образом прерывает синтаксический анализ CSV, когда ячейки содержат разрывы строк. Это поддерживается csv, но реализация microsofts кажется ошибочной. Также он как-то не обнаружил специфических немецких символов. Придание ему правильной культуры не изменило этого поведения. Все файлы (csv и script) сохраняются в кодировке utf8. Сначала я написал следующий код для вставки CSV ячейка за ячейкой.

$ex = New-Object -com "Excel.Application"
$ex.visible = $true;
$csv = "path\to\your\csv.csv";
$ex.workbooks.add();
$ex.activeWorkbook.activeSheet.Cells.NumberFormat = "@";
$data = import-csv $csv -encoding utf8 -delimiter ";"; 
$row = 1; 
$data | %{ $obj = $_; $col = 1; $_.psobject.properties.Name |%{if($row -eq1){$ex.ActiveWorkbook.activeSheet.Cells.item($row,$col).Value2= $_ };$ex.ActiveWorkbook.activeSheet.Cells.item($row+1,$col).Value2 =$obj.$_; $col++ }; $row++;}

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

function csvToExcel($csv,$delimiter){
     $a = New-Object -com "Excel.Application"
     $a.visible = $true

    $a.workbooks.add()
     $a.activeWorkbook.activeSheet.Cells.NumberFormat = "@"
     $data = import-csv -delimiter $delimiter $csv; 
     $array = ($data |ConvertTo-MultiArray).Value
     $starta = [int][char]'a' - 1
     if ($array.GetLength(1) -gt 26) {
         $col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char](($array.GetLength(1)%26) + $Starta)
     } else {
         $col = [char]($array.GetLength(1) + $starta)
     }
     $range = $a.activeWorkbook.activeSheet.Range("a1:"+$col+""+$array.GetLength(0))
     $range.value2 = $array;
     $range.Columns.AutoFit();
     $range.Rows.AutoFit();
     $range.Cells.HorizontalAlignment = -4131
     $range.Cells.VerticalAlignment = -4160
}

 function ConvertTo-MultiArray {
     param(
         [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
         [PSObject[]]$InputObject
     )
     BEGIN {
         $objects = @()
         [ref]$array = [ref]$null
     }
     Process {
         $objects += $InputObject
     }
     END {
         $properties = $objects[0].psobject.properties |%{$_.name}
         $array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
         # i = row and j = column
         $j = 0
         $properties |%{
             $array.Value[0,$j] = $_.tostring()
             $j++
         }
         $i = 1
         $objects |% {
             $item = $_
             $j = 0
             $properties | % {
                 if ($item.($_) -eq $null) {
                     $array.value[$i,$j] = ""
                 }
                 else {
                     $array.value[$i,$j] = $item.($_).tostring()
                 }
                 $j++
             }
             $i++
         }
         $array
     } 
} 
csvToExcel "storage_stats.csv" ";"

Вы можете использовать приведенный выше код, так как он должен конвертировать любые CSV-файлы в Excel. Просто измените путь к CSV и символу разделителя внизу.


слишком сложно
катит

1

В моем случае «Sept8» в CSV-файле, созданном с использованием R, был преобразован в «8-Sept» в Excel 2013. Проблема была решена с помощью функции write.xlsx2 () в пакете xlsx для генерации выходного файла в формате xlsx , который может быть загружен в Excel без нежелательного преобразования. Итак, если вам дан файл csv, вы можете попробовать загрузить его в R и преобразовать его в xlsx, используя функцию write.xlsx2 ().


Я не знаю, почему ваш ответ опущен. Это полезно людям, по крайней мере, использующим R. Этот ответ помог мне. Спасибо :)
Срихарша КБ

1

Обходной путь с помощью Google Drive (или Numbers, если вы на Mac):

  1. Откройте данные в Excel
  2. Установите формат столбца с неверными данными в Текст (Формат> Ячейки> Число> Текст)
  3. Загрузите файл .csv в Google Диск и откройте его с помощью Google Sheets
  4. Скопируйте оскорбительный столбец
  5. Вставить столбец в Excel как текст («Правка»> «Специальная вставка»> «Текст»)

Кроме того, если вы находитесь на Mac для шага 3, вы можете открыть данные в Numbers.


Это разумное решение, а не работать над ним часами без какого-либо решения.
imsrgadich

1

(EXCEL 2016 и позже, на самом деле я не пробовал в старых версиях)

  1. Открыть новую пустую страницу
  2. Перейти на вкладку «Данные»
  3. Нажмите «Из текста / CSV» и выберите свой CSV-файл
  4. Проверьте в предварительном просмотре, правильны ли ваши данные.
  5. В случае, когда какой-либо столбец конвертируется в дату, нажмите «изменить», а затем выберите тип текста, нажав на календарь в заголовке столбца.
  6. Нажмите «Закрыть и загрузить»

0

Хорошо, я нашел простой способ сделать это в Excel 2003 - 2007. Откройте пустую книгу xls. Затем перейдите в меню «Данные», импортируйте внешние данные. Выберите ваш CSV-файл. Пройдите через мастера, а затем в «формате данных столбца» выберите любой столбец, который необходимо принудительно «текст». Это приведет к тому, что весь столбец будет импортирован как текстовый формат, что помешает Excel попытаться обработать любые конкретные ячейки как дату.


0

Эта проблема все еще присутствует в Mac Office 2011 и Office 2013, я не могу предотвратить это. Это кажется такой простой вещью.

В моем случае у меня были значения, такие как "1 - 2" и "7 - 12" в CSV, правильно заключенные в кавычки, это автоматически преобразует дату в Excel, если вы попытаетесь впоследствии преобразовать ее в простой текст, который вы получите числовое представление даты, например 43768. Кроме того, оно переформатирует большие числа, найденные в штрих-кодах и числах EAN, в числа 123E +, которые не могут быть преобразованы обратно.

Я обнаружил, что Google Диски Google Диска не конвертируют числа в даты. Штрих-коды содержат запятые каждые 3 символа, но они легко удаляются. Он очень хорошо справляется с CSV, особенно когда имеешь дело с CSV для MAC / Windows.

Может спасти кого-нибудь когда-нибудь.


0

ПРОСТОЕ РЕШЕНИЕ Я только что понял это сегодня.

  • Открыть в Word
  • Заменить все дефисы с дефисом
  • Сохранить и закрыть
  • Открыть в Excel

Как только вы закончите редактирование, вы всегда можете снова открыть его в Word, чтобы снова заменить дефисы на дефисы.


0

Я делаю это для номеров кредитных карт, которые постоянно преобразуются в научную нотацию: в итоге я импортирую свой .csv в Google Sheets. Параметры импорта теперь позволяют отключить автоматическое форматирование числовых значений. Я установил для любых чувствительных столбцов обычный текст и загрузил как xlsx.

Это ужасный рабочий процесс, но по крайней мере мои ценности остались такими, какими они должны быть.


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

Я побеспокоил, спасибо. Я намекаю на то, что автоматический выбор форматирования является новой частью процесса импорта. Мой ответ обеспечивает очень специфический рабочий процесс для тех, кто, как и я, был вынужден использовать Sheets для решения этой конкретной проблемы. На мой взгляд, это заслуживает отдельного ответа. Незначительная корректировка вашего тона может фактически привести к тому, что ваш комментарий будет интерпретирован как полезный, и в этом весь смысл этого семейства веб-сайтов.
Brendonwbrown

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

0

Я сделал этот макрос VBA, который в основном форматирует диапазон вывода в виде текста перед вставкой чисел. Прекрасно работает для меня, когда я хочу вставить такие значения, как 8/11, 23/6, 1/3 и т. Д. Без Excel, интерпретируя их как даты.

Sub PasteAsText()
' Created by Lars-Erik Sørbotten, 2017-09-17
Call CreateSheetBackup

Columns(ActiveCell.Column).NumberFormat = "@"

Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard

ActiveCell.PasteSpecial

End Sub

Мне очень интересно знать, работает ли это и на других людей. Некоторое время я искал решение этой проблемы, но я не видел быстрого решения vba, в котором раньше не было вставки перед входным текстом. Этот код сохраняет данные в первоначальном виде.


-1

Если в начале поля поставить кавычку, она будет интерпретирована как текст.

Пример: 25/12/2008становится'25/12/2008

Вы также можете выбрать тип поля при импорте.


9
Я не хочу 'в начале моих данных.

27
-1. «Работает только тогда, когда введено непосредственно в Excel, но не работает в CSV - у вас будет дополнительный» символ в ячейке Excel после импорта.
TMS

-1

Альтернативный метод:

Преобразуйте формат столбца, который вы хотите изменить, в «Текст». Выберите все ячейки, которые вы хотите сохранить, скопируйте. Не отменяя выбор этих столбцов, нажмите «Редактировать> Специальная вставка> Как значения»

Сохранить как CSV. Обратите внимание, что это должно быть последним, что вы делаете с файлом, так как при повторном открытии он будет форматироваться как даты, поскольку форматы ячеек не могут быть сохранены в файлах CSV.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.