В 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
Подписывайтесь на мой канал и ставьте лайки.