Экспорт txt в csv с помощью Access DoCmd.TransferText acExportDelim в VBS

У меня есть большое количество файлов .txt (> 60k), которые необходимо преобразовать в .csv, разделенный точкой с запятой (поскольку некоторые поля представляют собой список с запятыми), чтобы я мог загрузить их на наш SQL-сервер.

Мне удалось написать файл .vbs, который будет загружать данные в базу данных Access, даже если таблицы не существует, но я не могу заставить acExportDelim перезаписать/создать новый файл. Это также дает ошибку, когда FileName.csv не существует.

Должно быть что-то, что я упускаю, но я не знаю, с чего мне начать искать.

CMD-ввод

C:\Afolder\TxtToCsv.vbs \\DataOnaServer\FileName.txt \\DataOnaServer\FileName.csv

.vbs-файл

Dim oAccess
Set oAccess = CreateObject("Access.Application")
oAccess.OpenCurrentDatabase("C:\Afolder\WDS.accdb")
oAccess.DoCmd.TransferText acImportDelim,"FileTxtImportSpec","FileName",WScript.Arguments.Item(0),1
oAccess.DoCmd.TransferText acExportDelim,"FileCsvExportSpec","FileName",WScript.Arguments.Item(1)
oAccess.Quit

Получено сообщение об ошибке, когда файл отсутствует. (Кажется, я еще не могу выложить изображение)

"Ядро базы данных Microsoft Access не смогло определить объект "lp4137.csv". Убедитесь, что объект существует и что вы правильно написали его имя и путь. Если "lp4137.csv" не является локальным объектом, проверьте сетевые подключения или обратитесь к администратору сервера." Код: 800A0BC3

Дизайн базы данных Blue Claw ссылка на загружаемый демонстрационный файл с нажатием кнопки VBA с запуском аналогичного скрипта .


person Maveleye    schedule 31.08.2012    source источник
comment
Какая у вас ошибка? Хранится ли файл по пути, где в именах каталогов есть пробелы?   -  person rene    schedule 31.08.2012
comment
Я добавил сообщение об ошибке. С путем проблем нет, так как acImportDelim указывает на одно и то же место.   -  person Maveleye    schedule 31.08.2012
comment
Вы можете проверить, работает ли это, если вы сохраните csv на локальном диске?   -  person rene    schedule 31.08.2012
comment
Нет никакой разницы, когда я перемещаю местоположение в папку «Загрузки» на C :. А также такая же ошибка, если отсутствует файл csv.   -  person Maveleye    schedule 31.08.2012
comment
Процесс должен быть полностью автономным. Если VBA в Access можно вызвать с помощью CMD, то я полностью за это. Экспорт работает нормально, если я делаю это вручную. Я только что нашел файл от Blue Claw, на котором работает VBA, который работает по нажатию кнопки. Поэтому я предполагаю, что могу просто использовать макрос, который запускает одну и ту же команду.   -  person Maveleye    schedule 31.08.2012
comment
Я запускаю это с отдельного сервера, на котором программы настроены на запуск по таймеру. По сути, он просто должен иметь возможность работать без вмешательства человека.   -  person Maveleye    schedule 31.08.2012


Ответы (2)


Этот вопрос является хорошим примером того, почему важно всегда включать Option Explicit в ваш VBScript, как вы должны делать это для кода VBA.

Рассмотрим этот VBScript.

WScript.Echo "TypeName(acImportDelim): " & TypeName(acImportDelim)
WScript.Echo "TypeName(acExportDelim): " & TypeName(acExportDelim)

Запуск этого скрипта в командном окне возвращает это...

C:\share\Access>cscript //NoLogo AccessNamedConstants.vbs
TypeName(acImportDelim): Empty
TypeName(acExportDelim): Empty

Но включение Option Explicit в качестве первой строки этого скрипта вызывает ошибку, потому что именованные константы Access неизвестны обработчику скрипта, поэтому он предполагает, что они должны быть необъявленными переменными. А поскольку Option Explicit рассматривает необъявленные переменные как ошибки, появляется раннее предупреждение о проблемах с этими именованными константами.

C:\share\Access>cscript //NoLogo AccessNamedConstants.vbs
C:\share\Access\AccessNamedConstants.vbs(2, 1) Microsoft VBScript runtime error:
 Variable is undefined: 'acImportDelim'
person HansUp    schedule 31.08.2012

В вашем vbscript вам нужно будет специально определить перечисление AcTextTransferType. В MS Access эти перечисления определены в библиотеке доступа и будут найдены. Однако vbscript не сможет распознать значения перечисления и выдаст ошибку.

acExportDelim = 2
acImportDelim = 0

Вы можете найти перечисления в этой статье msdn: http://msdn.microsoft.com/en-us/library/office/ff194227.aspx

person Fink    schedule 31.08.2012
comment
Только что понял решение. VBScript любит числа, а не словесные команды. Хуже всего то, что вчера я столкнулся с той же проблемой с TextToColumn. - person Maveleye; 31.08.2012
comment
Это очень легко упустить из виду с помощью vbscript и любых объектов с поздней привязкой. Я все еще путаюсь в этом все время. - person Fink; 31.08.2012