Текстовые файлы (в основном знаем как файлы с расширением 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
Если Вам нравятся публикации, которые я предоставляю, то подписывайтесь на мой канал и ставьте лайки.