Найти тему
Некто

Статья 10. Перенос данных из DBF в XLS или XLSX файлы на VBScript с использованием ADO.

В 8 и 9 статьях я показал, как перенести данные из dbf файла в текстовый файл и обратно. Конечно работа с текстовыми файлами это не с dbf и EXCEL. В текстовом файле можно делать и поиск дубликатов, и сортировку, а если данные упорядочены и разделены явным символом разделителем и еще легче. Вопрос, стоит ли этим заниматься. Я могу еще, как то представить базы данных на текстовых файлах, но какие необходимы возможности, чтобы их сопровождать. В основном все привыкли думать, что базы данных это отдельные СУБД или определенные приложения. Да, в этом все так, но вводить данные можно и в текстовые файлы и также можно создавать некоторое количество файлов и по определенному ключу их сопоставлять. Конечно, EXCEL это книга и там можно и сортировать и делать фильтры и как в базу завязать почти все листы а если не хватит, то добавить можно другую книгу. Также это можно сделать и в ГУГЛ таблицах. Здесь понятие автоматизации можно записать на VB, VBS и JS и этим доказывать, что создали базу данных. А если Вы создали формы ввода в ЯНДЕКС и ГУГЛ на Яндекс диске и Гугл диске в облаке тем более можете похвастаться, что создали базы данных на основе этих форм, не прибегая к полноценной и профессиональной СУБД. А потом делать статистику и думать, что удобнее всех удобных надобностей и гордиться этим. Там все приспособлено. Есть и формулы и различные условия под это. Только живи, работай и не зевай. Книг написано можно, так выразиться уйма. Примеров в ИНТЕРНЕТе еще больше. Текстовые, а что текстовые файлы. Под них надо писать мощный аппарат взаимодействия и нужно ли это. Да есть приложения, которые могут отыскать в текстовых файлах дубли. Можно сделать и физическую сортировку текстового файла, но индексную возможно то же можно сделать, но я лично это не встречал. В СУБД на dbf или в ACCESS можно сделать как индексную сортировку и физическую сортировку данных, так там это введено, и надо просто это грамотно сделать. В текстовых файлах нет возможности делать SQL запросы и другие операции с отбором информации, хотя это можно продумать, но не всегда очевидно. Текстовые возможности были до СУБД, и на основе всего этого пришлось их создать. Я делал поиск в текстовых файлах дублей и сортировку. Там есть свои особенности. Все зависит от мощности файлов и длины текстовых строк. Приходилось в некоторых случаях создавать лишнее как бы поле, а при сортировке еще и иногда другой файл, куда записывались отсортированные данные. Все это не быстро, но на VBScript это тоже можно сделать. Писать формы под такие файлы то же неудобно, но возможно. Наверно есть еще фанаты и энтузиасты этого направления, но это все сугубо индивидуально. И сопоставлять все это совместно не стоит, если есть EXCEL или решение на СУБД. Поэтому надо просто понять, что если у Вас есть базы данных dbf или EXCEL или ACCESS, то оттуда можно перенести данные в текстовый файл для удобства пользователей в удобном восприятии информации. Также можно поиграть данными и записать их обратно. Если EXCEL является книгой из листов, то ACCESS книга, куда можно перегнать файлы как dbf (до 13 версии Office) так EXCEL и текстовые. Но я просто указал, как воспринимать переводы данных из текстовых файлов в dbf и обратно. Это удобней иногда сделать на VBScript от ODBC, тем более, если не установлен office, и ВЫ больше ничего не знали и никогда до этого, как это сделать. Здесь еще можно поговорить об ACCESS, где есть возможность подсоединять текстовые файлы. Работать с ними, а если надоест, то и преобразовывать в свои базы. И это отличное решение Microsoft, я имею в виду ACCESS, которая позволила создать братство форматов и обмениваться между собой данными. Можно перенести данные из dbf в текстовые файлы, а эти файлы подсоединить в ACCESS, а потом продумать их преобразование в свои локальные базы или в другие форматы. Чем не решение к переводу данных из dbf. Там же можете попытаться создать базы данных на основе текстовых файлов, если Вам это захочется. Microsoft улучшает ODBC и развивает это направление дальше. Так же будет развивать VBScript и JScript. Поэтому если Вы имеете понятие текстовых файлов, то можете запомнить что данные из них можно перенести в файлы СУБД и обратно. Но сейчас мы переключаемся на тему согласно заголовку, а именно перенос данных dbf файла в EXCEL файл или файлы. Если в предыдущих статьях Я показал, как перенести данные из EXCEL в dbf и из текстового файла в dbf и обратно, то в этой статье отмечу, как перенести данные из dbf в EXCEL. В принципе кто внимательно читал статьи с 1 по 6, смогут это понять и даже осуществить. Принцип переноса такой же, как из EXCEL в dbf. Есть маленькое отличие, и я это в нижеприведенном листинге покажу. Возникает только вопрос, а надо ли это делать. Ведь любая EXCEL среда легко воспринимает dbf формат, и нет проблем его подсоединения. Но это когда у Вас нет office или другого приложения, которое это может продемонстрировать. В отличие от переноса данных из EXCEL в dbf, скорость переноса данных больших dbf в EXCEL очень долгая и по времени нудная. Работа с такими dbf файлами на VBScript тем самым не совсем удобна, но делать это можно. Можете этот процесс попробовать, если захотите поэкспериментировать в этом направлении.

Листинг VBScript

'*******************************************************************

' Имя: AdoED10A.vbs

' Язык: VBScript

' Описание: Вывод данных из DBF файла в XLS или XLSX

' Полностью ODBC для dBase и EXCEL, ADO

'*******************************************************************

On Error Resume Next 'Проверка ошибок

Set WshShell=WScript.CreateObject("WScript.Shell")

SDefaultDir=WshShell.CurrentDirectory

Set FSO = CreateObject("Scripting.FileSystemObject")

FileTxt=SDefaultDir & "\_FileErr.txt" 'Файл ошибки

NameFil=SDefaultDir & "\_222.xls"

NameFilDBF=SDefaultDir & "\_111.dbf"

'========== Проверка файла

If FSO.FileExists(NameFilDBF) Then

else

MsgBox "Нет файла "&NameFilDBF

WScript.Quit

end if

'========== Проверка файла

'=========== Проверка файла

Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.FileExists(NameFil) Then

'MsgBox "Файл есть! Удаляем"

FSO.DeleteFile NameFil

End if

'========== Проверка файла

'=========== Проверка файла TXT

Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.FileExists(FileTxt) Then

'MsgBox "Файл есть! Удаляем"

FSO.DeleteFile FileTxt

End if

'========== Проверка файла

Set cnnMain = CreateObject("ADODB.Connection")

cnnMain.CursorLocation = 3

Set cnnMainR = CreateObject("ADODB.Recordset")

cnnMainCon="DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & SDefaultDir & ";"

cnnMain.Open cnnMainCon

'=================== dBase ==================

Set RSN=WScript.CreateObject("ADODB.Recordset")

Set conn = CreateObject("ADODB.Connection")

conn.CursorLocation = 3

conn.Open "Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & SDefaultDir & ";"

strSQLdbf="SELECT * FROM " & NameFilDBF & " "

Set RS = conn.Execute(strSQLdbf)

objKlRecs=RS.RecordCount 'Количество строк в DBF файле

objKlFields = RS.Fields.count 'Количество колонок в DBF файле

'=================== dBase ==================

' ==============Ввод названий Полей базы данных

'А вот в отличие от переноса данных из файлов EXCEL в dbf здесь необходимо вместо char поставить тип TEXT. Постановка char иногда выдавала ошибку.

SQL="create table " & NameFil & " ("

for i=0 to objKlFields-1

st=RS.Fields(i).Name

if i=objKlFields-1 then

SQL=SQL & "st" & i & " TEXT)"

else

SQL=SQL & "st" & i & " TEXT,"

end if

next

' ==============Ввод названий Полей базы данных

cnnMainR.open SQL,cnnMain,3

iu=0 'Признак вывода ошибок в текстовый файл

iuu=0 'Признак записи в текстовый файл

ikk=0 'Запись строки ошибок

'И тоже, в отличие от переноса данных из файлов EXCEL в dbf необходимо явно указать поля, в которые надо передать данные из dbf файла, т.е. это так для примера

insert into c:\1.xls (st1,st2,st3) values(“1”,”2”,”3”). Для этого вводим stN и stName

for i=1 to objKlRecs

vvv="'"

stN="("

for j=0 to objKlFields-1

st=RS.Fields(j)

'stName=RS.Fields(j).Name

stName="st"&j

if j=objKlFields-1 then

stN=stN & stName & ")"

vvv=vvv & st & "'"

else

stN=stN & stName & ","

vvv=vvv & st & "'" & "," & "'"

end if

next

SQL="insert into " & NameFil & " " & stN & " values(" & vvv & ")"

cnnMainR.open SQL,cnnMain,3

'11111111111111111111 Обработка ошибок 1111111111111111111

iu=0

If Err.Number <> 0 Then

iu=1

ikk=ikk+1

End If

if iu=1 then

iuu=i

Const ForWriting = 2

Set FOut = FSO.OpenTextFile(FileTxt,ForWriting,true)

if ikk=1 then

FOut.WriteLine "Строки ошибок"

end if

FOut.WriteLine (iuu)

end if

'11111111111111111111 Обработка ошибок 1111111111111111111

RS.MoveNext

next

On Error GoTo 0

if iuu>0 then

FOut.WriteLine "Ошибок " & iuu

FOut.Close

end if

ikk=0

iuu=0

iu=0

' Можно указать i, j, objKlRecs и другие переменные, а можно все это не указывать

Set WshShell=Nothing

Set FSO = Nothing

Set oFile=Nothing

set tables=Nothing

cnnMain.Close

Set cnnMain = Nothing

RS.close

Set RS = Nothing

Set RSN = Nothing

conn.close

Set conn = Nothing

if iuu>0 then

WScript.Echo("Проверьте журнал ошибок _FileErr.txt. Файл " & NameFilDBF & " Создан!")

else

WScript.Echo("Файл создан!")

end if

WScript.Quit

'*******************************************************************

Название листа xls или xlsx (по умолчанию создается). Потом можете исправить. Нормализацию делать необязательно. В EXCEL среде есть autofit (автоподбор ширины столбца и высоты строки)

В скрипт AdoED10A.vbs можно добавить вот такой фрагмент и создаем файл AdoED10B.vbs

Set objArgs=WScript.Arguments

if objArgs.Count>0 then

fileVvod=objArgs(0)

else

WScript.Echo " Введите имя файла DBF после AdoED10B.vbs "

WScript.Quit

end if

' ==== Ввод файла DBF через строку данные, которого надо перевести в создаваемый во время процесса файл XLS или XLSX ====

NameFilDBF = FSO.GetFile(fileVvod)

'=========== Проверка файла DBF

sStr=len(trim(NameFilDBF))

if uCase(Mid(trim(NameFilDBF),sStr-3,4))<>".DBF" then

MsgBox "Не файл DBF"

WScript.Quit

end if

'=========== Проверка файла DBF

Файлы в архиве Файлы10.rar. Файлы можно редактировать, а также переделать на JScript.

Внимание!!! Если dbf файл очень большой, то процесс переноса данных из него в EXCEL файл удобно наблюдать и отслеживать в файловом менеджере FAR в той директории (каталоге) где и происходит этот действие. И еще, строки, где есть символ переноса строки, легко переносится в ячейку и вставлять функцию определения переноса строки я не стал. Если это Вам это потребуется, то можете ее вставить. Эта функция описана в статье 9.

Ссылка на файл Файлы10.rar https://disk.yandex.ru/d/MrV0ZM_JPQJ6tg

Подписывайтесь на мой канал и ставьте лайки.