Найти в Дзене
Некто

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

Текстовые файлы (в основном знаем как файлы с расширением TXT). Большинство людей работают с эти форматом. Самый распространенный и наверно для многих самый удобный формат для работы (допустим, что нет office и т.п.). Я не буду это явление рассматривать. Просто уточню, что такой формат используют многие программы и даже не только специально предназначенные для этого программы-редакторы. Причем много бесплатных и удобных. Данные из текстовых файлов можно перенести в файлы EXCEL и dbf. В EXCEL это сделать быстрее, а вот в dbf для этого надо иметь определенные знания. Все это как я уже раньше писал, можно просмотреть в ИНТЕРНЕТе. Данные из текстового файла можно было перенести в EXCEL и тут же создать dbf файл (в ранних версиях office). Возможно, сейчас есть текстовые редакторы, которые это делают, но не все ими пользуются за их в некоторых случаях можно сказать ненадобностью. Можно конечно изловчиться и добавлять данные из текстового файла напрямую в dbf как текст, но для этого надо хор

Текстовые файлы (в основном знаем как файлы с расширением TXT). Большинство людей работают с эти форматом. Самый распространенный и наверно для многих самый удобный формат для работы (допустим, что нет office и т.п.). Я не буду это явление рассматривать. Просто уточню, что такой формат используют многие программы и даже не только специально предназначенные для этого программы-редакторы. Причем много бесплатных и удобных. Данные из текстовых файлов можно перенести в файлы EXCEL и dbf. В EXCEL это сделать быстрее, а вот в dbf для этого надо иметь определенные знания. Все это как я уже раньше писал, можно просмотреть в ИНТЕРНЕТе. Данные из текстового файла можно было перенести в EXCEL и тут же создать dbf файл (в ранних версиях office). Возможно, сейчас есть текстовые редакторы, которые это делают, но не все ими пользуются за их в некоторых случаях можно сказать ненадобностью. Можно конечно изловчиться и добавлять данные из текстового файла напрямую в dbf как текст, но для этого надо хорошо знать структуру dbf файла. Текстовые редакторы входят в состав многих операционных систем, но и они не переводят данные в dbf формат. Да много что можно написать про текстовый формат, и я не буду на этом останавливаться. В этом же случае я просто покажу перевод данных из текстового файла в создаваемый dbf файл на VBScript. В отличии от csv в таких файлах строки не идут друг за другом и иногда нет разделителей. Перенос данных из csv файла в dbf или преобразования cvs в dbf я рассматривать не буду. В интернете много программ предоставляющих такое действие. Буду рассматривать, так можно сказать неудобные текстовые файлы, где данные расположены почти в разном произвольном порядке. Рассмотрю без разделителей и с разделителями. Я буду рассматривать текстовые файлы без заголовков. В таких файлах просто надо убрать текст, который не имеет вид и понятие таблицы.

Рассмотрим вот такой вид без разделителей (файл test.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

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

Или вот с явными разделителями (файл 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|

Причем разделители и данные находятся в не упорядоченном виде.

Такие файлы также могут быть большими и иметь много данных.

Здесь можно задуматься о количестве символов на листе (его размерах).

Конечно, хотелось бы, что бы все было в порядке, но бывает как есть.

Текстовые файлы должны быть в Win кодировке. DOS можно кодировку переделать в Far, Total commander, и другими. Если они в DOS кодировке, то в программе, заремачьте PoStr1=DosToWin(PoStr1) и другие PoStr*=DosToWin(PoStr*) и Вам функция DosToWin не понадобиться. Я не делаю автоматический выбор кодировки. В редких случаях она DOS кодировка. Вообще с кодировкой будьте внимательны. Текстовые файлы сильно подвержены этой проблеме и, если это не понять и очень много надо переносить данных, то потом надо все переделывать, а это время.

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

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

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

' Имя: AdoED7A.vbs

' Язык: VBScript

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

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

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

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

SDefaultDir=WshShell.CurrentDirectory

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

fileDBF=SDefaultDir& "\_222.dbf"

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

fileTXT=SDefaultDir & "\test.txt"

Set FSO = CreateObject("Scripting.FileSystemObject")

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

If FSO.FileExists(FileTXT) Then

else

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

WScript.Quit

end if

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

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 & " (st1 char(6), st2 char(39), st3 char(10), st4 char(1))"

'==============Ввод названий Полей базы данных для 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 =======

'До этого все, как и в предыдущих примерах. А вот с этого момента следующее.

'Значит, открываем файл test.txt на чтение. Выше указано как подсоединяется этот файл.

Set TextStream = FileName.OpenAsTextStream(1)

' vbNullString - Символ, имеющий значение 0 или строка, имеющая нулевое значение

' Здесь можете поставить свой цикл, ну например

' Do While Not TextStream.AtEndOfStream

' Loop

' Учтите выход из цикла или прервать его выполнение в While Wend не

' предполагается. Его придется останавливать с помощью диспетчера задач как процесс.

' А цикл Do While Loop и другие можно остановить выполнение и выйти из цикла работы

' с помощью команды do exit и т. д.

' Здесь решать Вам в каких случаях это сделать.

While Not TextStream.AtEndOfStream

Str = TextStream.ReadLine()

PoStr1=Trim(Mid(Str,5,2))

'Имя функции DosToWin перевода можете назвать как Вам угодно, н только исправьте в название в шапке функции.

PoStr1=DosToWin(PoStr1)

PoStr2=Trim(Mid(Str,8,40))

PoStr2=DosToWin(PoStr2)

PoStr3=Trim(Mid(Str,48,2))

PoStr3=DosToWin(PoStr3)

PoStr4=Trim(Mid(Str,59,1))

PoStr4=DosToWin(PoStr4)

vvv="'"

for j=1 to 4 ' В нашем случае 4 колонки – ставьте точное количество

st=Eval("PoStr"&j)

if j=4 then

vvv=vvv & st & "'"

else

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

end if

next

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

' Этот фрагмент Я заремачил (закомментировал)

' Это когда Вы хотите пропустить строки нулевой длины

' Я указал это так. В VBScript нет оператора GoTo, а жаль. Если Вы умеете понять структуру программы, то этим оператором удобно управлять.

' Теперь если после каждой строчки с данными идет выделение этой строки, например, подчеркивание ====== или вот такое -----------------

' То чтобы пропустить эту строчку вставьте оператор

' TextStream.SkipLine()

' Будет пропускаться строка.

'if Str= vbNullString or Str="" then

' MsgBox "Пустая строка"

' TextStream.SkipLine() ' Пропускаем 1 строку можно и не пропускать

' else

' RSN.open SQL,conn,3

' end if

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

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

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

Set objArgs=WScript.Arguments

if objArgs.Count>0 then

fileTXT=objArgs(0)

else

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

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

WScript.Quit

end if

И вот такой.

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

Set FileName = FSO.GetFile(fileTXT)

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

Что могу еще сообщить. Конечно, данные в файлах разбросаны, и их надо привести к определенному порядку. Все зависит от размера файла и желания потрудиться. Если такие файлы будут у Вас появляться, и если они необходимы, то можно и потрудиться. Главное найти самую большую строку по размеру и определить количество колонок. Только учтите количество символов в записях (строках) под колонки не должны превышать 254. Про понятие MEMO я уже писал в 1 статье, и повторяться не буду. И еще, грамотно определитесь в количестве колонок (полей). Можно также написать скрипт под это или используйте хороший текстовый редактор. Если же некоторые данные, такие как даты, вы хотите перевести в dbf формат, то укажите формат date. Как это сделать я уже указывал в 1 статье.

В следующей статье я опишу, как получить dbf файл из текстового файла с явными разделителями пример 2 (test1.txt) и другие действия с помощью VBScript .

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

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

Если Вам нравятся публикации, которые я предоставляю, то подписывайтесь на мой канал и ставьте лайки.