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

Статья 8. Перенос данных из текстовых файлов в dbf на VBScript с использованием ADO. Разделители. Продолжение 7 статьи.

В 7 статье Я показал, как перенести данные из текстового файла в создаваемый dbf файл. Причем данные в текстовом файле были без явных разделителей. Конечно если текстовый файл очень большой, то очень затруднительно это сделать, а иногда даже представить трудно, как привести в нем данные в необходимый порядок. Если же файл не очень большой и часто Вам необходим то, как я уже отмечал в 7 статье можно конечно и потрудиться. Но опять же хорошо, если Вы сами создали такой текстовый файл, а если Вам его дали и попросили перенести данные в dbf файл. Вот тут Вам надо найти решение как это осуществить. Я уже указывал, есть редакторы, которые это могут сделать или сами можете написать скрипт (если умеете). Напоследок если есть EXCEL, то можете там определиться с колонками или попросить, как говорится знакомых продвинутого пользователя или программиста над этим призадуматься. Такие текстовые файлы есть и если Вы с такими файлами стали работать, то Вам надо продумать все варианты, которые Я указал. Если Вы нашли свое решение то же неплохо.

А теперь Я расскажу, как перевести данные из текстового файла с явными разделителями. Такие файлы то же есть. И если надо создать dbf файл и перенести в него данные, то также имеется решение. Причем разделители могут быть всякие, но они не должны быть среди символов в строке. Некоторые программы скидывают данные в текстовые файлы с явными разделителями и если проанализировать такой текстовый файл, то можно выделить такой символ и как бы взять его за основу и сделать явным разделителем.

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

Рассмотрим файл с явными разделителями (файл test1.txt). За разделитель в строке, возьмем символ “|”

1|Город |1 |1|

2|Село |1 |1|

3|Поселок |4 |4|

4|Деревня |1 |1|

5 |Городской округ |1 |1|

6|Поселение |4 |5|

7|Мегаполис |4 |4|

8|Район |2 |2|

9|Область |4 |5|

10 |Регион |1 |1|

Причем разделитель (символ “|”) и данные находятся в не упорядоченном виде. Такие файлы также могут быть большими и иметь много данных. Здесь необходимо задуматься о количестве символов на листе (его размерах). Конечно, хотелось бы, что бы все было в порядке, но бывает как есть. Количество символов-разделителей и есть количество колонок. Это количество колонок и необходимо запечатлеть в создаваемом dbf файле. Опять же повторюсь текстовые файлы желательно иметь в Win кодировке. DOS можно кодировку переделать в Far, Total commander, и другими. Если они в DOS кодировке, то в программе, заремачьте PoStr=DosToWin(PoStr) и Вам функция DosToWin не понадобиться. Я не делаю автоматический выбор кодировки. В редких случаях она DOS кодировка. Как я уже указывал в 7 статье, с кодировкой будьте внимательны.

Теперь рассмотрим и разберем скрипт, к 2 примеру (test1.txt)

Везде под текстовым файлом будем просто подразумевать TXT. Так проще.

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

' Имя: AdoED8A.vbs

' Язык: VBScript

' Описание: Вывод данных из TXT файла с разделителями в DBF

' ODBC и ADO только для dBase

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

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

SDefaultDir=WshShell.CurrentDirectory

' ==== Создаваемый DBF ====

fileDBF=SDefaultDir& "\_222.dbf"

' ==== TXTфайл который должен уже находится в текущей директории ====

fileTXT=SDefaultDir & "\test1.txt"

Set FSO = CreateObject("Scripting.FileSystemObject")

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

If FSO.FileExists(fileTXT) Then

else

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

WScript.Quit

end if

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

Set FileName = FSO.GetFile(fileTXT)

Set TextStream = FileName.OpenAsTextStream(1)

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

If FSO.FileExists(fileDBF) Then

FSO.DeleteFile fileDBF

End if

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

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

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

Set conn = CreateObject("ADODB.Connection")

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

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

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

SQL="create table " & fileDBF & "("

for i=1 to 4

stPol="st"&i

stDL= 19 ' Здесь можно подобрать длину поля (имя)

if i=4 then

SQL=SQL & "st" & i & " char(" & stDL & "))"

else

SQL=SQL & "st" & i & " char(" & stDL & "),"

end if

next

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

conn.Open SConnect

RSN.open SQL,conn,3

' ======== Кодировка 866 =======

Set oFile = FSO.GetFile(fileDBF)

With oFile.OpenAsTextStream()

readBinary = .Read(oFile.Size)

.Close

End With

readBinary=left(readBinary,29)+"e"+mid(readBinary,31)

With FSO.createTextFile(fileDBF)

.Write(readBinary)

.Close

End With

' ======== Кодировка 866 =======

' А вот с этого момента немного поясню. Вот здесь в нижеприведенном фрагменте Я и отбираю в строке данные по колонкам согласно, символа разделителя “|”

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

Для того чтобы пропустить строку вставьте оператор TextStream.SkipLine()

Все остальные понятия уже есть и представлены в 7 статье.

iss=1

While Not TextStream.AtEndOfStream

Str = TextStream.ReadLine()

vvv="'"

for j=1 to 4

InSimv=InStr(iss,Str,"|",1) ' Ставим символ разделитель строки

PoStr=Mid(Str,iss,InSimv-iss)

PoStr=DosToWin(PoStr)

st=PoStr

if j=4 then

vvv=vvv & st & "'"

else

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

end if

iss=InSimv+1

next

iss=1

SQL="insert into " & fileDBF & " values(" & vvv & ")"

RSN.open SQL,conn,3

Wend

'------------------------ Функция преобразования символов в русскую кодировку ----------

Function DosToWin(s)

ss=""

For i=1 To Len(s) ' Проверяем все символы в строке.

k = Asc(Mid(s,i,1)) ' Рассматриваем и определяем ANSI-код каждого символа. Шаг 1 символ в строке

If (k>=128) And (k <= 175) Then

k=k+64

ElseIf (k>=224) And (k <= 239) Then

k=k+16

ElseIf k = 240 Then ' Символ Ё

k=168

ElseIf k = 241 Then ' Символ ё

k=184

ElseIf k = 252 Then ' Символ №

k=185

End If

ss=ss+Chr(k) ' Возвращаем преобразованную строку

Next

DosToWin=ss

End Function

'------------------------ Функция ----------

Set WshShell=Nothing

Set FSO = Nothing

Set FileName=Nothing

Set oFile=Nothing

TextStream.Close

Set TextStream=Nothing

conn.close

Set conn = Nothing

Set RSN = Nothing

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

WScript.Quit

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

Set objArgs=WScript.Arguments

if objArgs.Count>0 then

fileTXT=objArgs(0)

else

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

' (в большинстве случаев с расширением txt)

WScript.Quit

end if

И вот такой.

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

Set FileName=FSO.GetFile(fileTXT)

Насчет нормализации dbf файла Вы можете вставить фрагмент, который я указал в статье 3 из файлов AdoED3A.vbs или AdoED3B.vbs

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

Ссылка на файл https://disk.yandex.ru/d/JvkL0R-m9m2u3g

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