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

Статья 13. Вывод данных из текстового файла в EXCEL на VBScript с использованием ADO. Работа с данными.

В 12 статье рассмотрели работу в EXCEL по обмену данными между файлами и вывод данных из EXCEL файлов в текстовый файл. Да текстовый файл создавался с разделителями. Можно по-другому перевести в текстовый файл. Я об этом уже писал.

Можно применить v=RSQ.GetString с последующим выводом в текстовый файл.

Прочитать блокнотом или другими приложениями. В этой статье я расскажу, как вывести данные из текстового файла в файлы EXCEL. Прежде чем это сделать, Я поясню, что этот вывод немного похож на вывод данных из текстовых файлов в dbf файл. Данные необходимо вывести автоматом, подобрав длину строки в символах с понятием символов разделителей. Если файл не имеет четких символов разделителей, то это приведет к ошибке. Можно не делать нормализацию из текстового файла по полям-заголовкам, а можно и делать. EXCEL файл это не файл dbf, где нужна нормализация и вполне подойдет сделать autofit в явном решении. Можно потом сделать нормализацию из EXCEL файла и сортировку по критериям, с которыми можно определиться. Не из всех текстовых файлов легко перевести данные. У меня бывали случаи, когда Я переводил в EXCEL большие по размеру и объему текстовые файлы, а бывали когда разбирался и отрабатывал незначительные. И, еще пресловутый АПОСТРОФ, который ставится перед данными и его нельзя убрать с помощью ADO. Я не нашел такого решения и возможно в ADO его нет. Его можно убрать только явно алгоритмом или скриптом или в самом приложении EXCEL. Но он и не мешает, чтобы сильно беспокоится. В основном я переношу данные в текстовом формате.

Я подготовил 3 файла работы с текстовым файлом _111.txt. Это файлы AdoED13A.vbs, AdoED13B.vbs, AdoED13C.vbs. Файл AdoED13B.vbs я опишу подробнее. Тексты других файлов в некотором случае совпадают с текстом этого файла. В нем больше информации для размышления. Предоставляю файл AdoED13B.vbs

По ходу приложу некоторые комментарии.

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

' Имя: AdoED13B.vbs

' Язык: VBScript

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

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

' С подключение строки с файлом из консоли

' Нормализация из текстового файла

' Операции с данными txt и EXCEL

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

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

SDefaultDir=WshShell.CurrentDirectory

Set FSO = CreateObject("Scripting.FileSystemObject")

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

fileTXT=SDefaultDir & "\test1.txt"

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

If FSO.FileExists(FileTXT) Then

else

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

WScript.Quit

end if

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

Set FileName = FSO.GetFile(fileTXT)

Set TextStream = FileName.OpenAsTextStream(1)

' ==== Создаваемый EXCEL файл ====

NameFil=SDefaultDir & "\_222.xls"

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

If FSO.FileExists(NameFil) Then

FSO.DeleteFile NameFil

End if

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

'======================= EXCEL =============

Set cnnMain = CreateObject("ADODB.Connection")

Set cnnMainR = CreateObject("ADODB.Recordset")

cnnMain.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & NameFil & ";Deleted=0;ReadOnly=0;Exclusive=0;"

cnnMain.CursorLocation = 3

'======================= EXCEL =============

'========== Количество столбцов =======

Kstl=0

Str = Trim(TextStream.ReadLine())

for i=1 to Len(str)

if Mid(str,i,1)="|" Then

Kstl=Kstl+1

end if

next

if Kstl=0 then

WScript.Echo("Неправильно указан символ разделитель или нет такого символа")

WScript.Quit

end if

Set TextStream = FileName.OpenAsTextStream(1)

ReDim MassStrS(Kstl),MassMax(Kstl)

iss=1

nn=0

While Not TextStream.AtEndOfStream

Str = TextStream.ReadLine()

nn=nn+1

for j=1 to Kstl

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

st=Trim(Mid(Str,iss,InSimv-iss))

MassStrS(j)=len(st)

if MassStrS(j)=0 then

MassStrS(j)=9

end if

if nn=1 then

MassMax(j)=MassStrS(j)

else

if MassMax(j)<MassStrS(j) then

MassMax(j)=MassStrS(j)

end if

end if

iss=InSimv+1

next

iss=1

Wend

nn=0

Erase MassStrS

SumSimv=0

for i=1 to Kstl

SumSimv=SumSimv+MassMax(i)

next

if SumSimv>=3810 then

WScript.Echo("Общее количество символов больше 3810")

WScript.Quit

end if

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

'SQL="create table " & NameFil & ".[xls] ("

'for i=1 to Kstl

' if i=Kstl then

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

' else

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

' end if

'next

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

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

SQL="create table " & Namefil & ".[xls] ("

for i=1 to Kstl

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

if i=Kstl then

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

else

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

end if

next

Erase MassMax

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

cnnMainR.open SQL,cnnMain,3 ' Создание шапки с заголовками в EXCEL

'==============Вывод данных из текстового файла в EXCEL

Set TextStream = FileName.OpenAsTextStream(1)

iss=1

While Not TextStream.AtEndOfStream

Str = TextStream.ReadLine()

vvv="'"

stN="("

for j=1 to Kstl

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

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

PoStr=DosToWin(PoStr)

st=Trim(PoStr)

stName="st"&j ' должно совпадать с "st" & i

if j=Kstl then

stN=stN & stName & ")"

vvv=vvv & st & "'"

'vvv=vvv & st & " "

else

stN=stN & stName & ","

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

end if

iss=InSimv+1

next

iss=1

' SQL="insert into " & NameFil & ".[xls] " & stN & " values(" & vvv & ")"

SQL="insert into " & NameFil & ".[xls] values(" & vvv & ")"

cnnMainR.open SQL,cnnMain,3

Wend

'==============Вывод данных из текстового файла в EXCEL

'Вот здесь снова запускается EXCEL файл и можно показать количество фильтров и сортировки.

cnnMain.close

Set cnnMain = CreateObject("ADODB.Connection")

Set cnnMainR = CreateObject("ADODB.Recordset")

cnnMain.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & NameFil & ";Deleted=0;ReadOnly=0;Exclusive=0;"

cnnMain.CursorLocation = 3

strSQLn="SELECT * FROM " & NameFil & ".[xls$]"

cnnMainR.open strSQLn,cnnMain,2,2

Set RSK = cnnMain.Execute(strSQLn)

KlFieldsN = RSK.Fields.count

KlRecsN=RSK.RecordCount

stNameN=""

for j=0 to KlFieldsN-1

stName=RSK.Fields(j).name

if j=KlFieldsN-1 then

stNameN=stNameN & stName

else

stNameN= stNameN & stName & ","

end if

next

' strSQLn="SELECT * FROM [xls$] where IsNull(st2)=false ORDER BY " & stNameN & " " 'Правильно автомат по всему листу

' strSQLn="SELECT st2 FROM [xls$] IsNull(st2)=false ORDER BY st2" 'Можно и так

' strSQLn="SELECT* FROM [xls$]" 'Просто выбор данных с листа xls и без NULL

' strSQLn="SELECT * FROM [xls$A12:D5] where IsNull(st2)=false ORDER BY st2" 'Можно и так

' strSQLn="SELECT * FROM [xls$C5:B1] where IsNull(st2)=false ORDER BY st2" 'Можно и так

strSQLn="SELECT * FROM [xls$] where IsNull(st2)=false ORDER BY st2" 'Можно и так

Set RSK = cnnMain.Execute(strSQLn)

KlFieldsN = RSK.Fields.count

KlRecsN=RSK.RecordCount

strSQlDelNlist="DROP TABLE " & NameFil & ".[xls$A2:D]"

cnnMain.Execute(strSQlDelNlist)

'********************************** 1 фрагмент *********************

'После фильтров и сортировки возвращаем из RecordSet данные и снова записываем в EXCEL файл. Можно сказать, данные из текстового файла можно записать в любой сортировке и фильтра. Конечно, можно отобрать определенные данные, когда переносим их из текстового файла по созданным для этого условий с помощью фильтров и условий в комбинации if…then. Таким образом, данные текстового файла можно регулировать и продумывать сценарии их записи и обработки.

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

RSK.MoveFirst

cnnMainR.MoveFirst

cnnMainR.Requery

for i=1 to KlRecsN

for j=0 to KlFieldsN-1

st=RSK.Fields(j)

stName=RSK.Fields(j).name

cnnMainR.Fields(stName).Value=st

'cnnMainR.Fields(j).Value=st 'Можно и так

next

KlRecsNew=i+1

strSQlDelNlist="DROP TABLE [xls$A" & KlRecsNew & ":D" & KlRecsNew & "]"

cnnMain.Execute(strSQlDelNlist)

cnnMainR.MoveNext

RSK.MoveNext

next

strSQlDelNlist="DROP TABLE [xls$A" & KlRecsN+2 & ":D]"

cnnMain.Execute(strSQlDelNlist)

On Error goto 0

'********************************** 1 фрагмент *********************

'WScript.Echo("Фрагмент 1. Файл создан!")

'WScript.Quit' Если хотите просмотреть предыдущие решения

'********************************** 2 фрагмент *********************

'В этом фрагменте после фильтров и сортировки с данными уже в EXCEL можно проводить различные операции. Здесь мы добавляем к данным 2 поля счетчик массива.

Если хотите посмотреть, что произошло, то уберите знак ' (апостроф) с этих строк.

'WScript.Echo("Фрагмент 2. Файл создан!")

'WScript.Quit' Если хотите просмотреть предыдущие решения

Лучше посмотреть что получилось.

cnnMain.close

Set cnnMain = CreateObject("ADODB.Connection")

cnnMain.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & NameFil & ";Deleted=0;ReadOnly=0;Exclusive=0;"

cnnMain.CursorLocation = 3

strSQLn="SELECT * FROM " & NameFil & ".[xls$]"

cnnMainR.open strSQLn,cnnMain,2,2

Set RSK = cnnMain.Execute(strSQLn)

KlFieldsN = RSK.Fields.count

KlRecsN=RSK.RecordCount

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

cnnMainR.MoveFirst

cnnMainR.Requery

for i=1 to KlRecsN

stDn1=trim(cnnMainR.Fields(1).value)

cnnMainR.Fields("st2").Value=stDn1 & i

'cnnMainR.Fields(1).Value=stDn1 & i 'Можно и так

cnnMainR.Update

KlRecsNew=i+1

strSQlDelNlist="DROP TABLE [Sheet1$A" & KlRecsNew & ":D" & KlRecsNew & "]"

cnnMain.Execute(strSQlDelNlist)

cnnMainR.MoveNext

next

On Error goto 0

'********************************** 2 фрагмент *********************

'WScript.Echo("Фрагмент 2. Файл создан!")

'WScript.Quit' Если хотите просмотреть предыдущие решения

'********************************** 3 фрагмент *********************

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

'strSQLn="SELECT * FROM [xls$A4:D9]" 'Просто выбор данных с листа xls

strSQLn="SELECT * FROM [xls$A4:D9] ORDER BY 1" ' Сортировка по полю st1

Set RSK = cnnMain.Execute(strSQLn)

KlRecsN=RSK.RecordCount

strSQlDelNlist="DROP TABLE " & NameFil & ".[xls$A2:D]"

cnnMain.Execute(strSQlDelNlist)

RSK.MoveFirst

cnnMainR.MoveFirst

cnnMainR.Requery

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

for i=1 to KlRecsN

for j=0 to KlFieldsN-1

st=RSK.Fields(j)

cnnMainR.Fields(j).Value=st

next

KlRecsNew=i+1

strSQlDelNlist="DROP TABLE [xls$A" & KlRecsNew & ":D" & KlRecsNew & "]"

cnnMain.Execute(strSQlDelNlist)

cnnMainR.MoveNext

RSK.MoveNext

next

strSQlDelNlist="DROP TABLE [xls$A" & KlRecsN+1 & ":D]"

cnnMain.Execute(strSQlDelNlist)

On Error goto 0

'********************************** 3 фрагмент *********************

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

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

TextStream.Close

Set TextStream=Nothing

cnnMain.Close

Set cnnMain = Nothing

Set cnnMainR = Nothing

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

WScript.Quit

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

Остальное как обычно.

Можно отредактировать и снова в dbf или в текстовый файл.

Как я в предыдущей статье указал - круговорот данных в масштабных понятиях работы с данными.

Перед запуском скриптов файл _111.txt сохраните в другом каталоге для повторного применения, если случайно испортите или удалите.

Процесс переноса данных в EXCEL из больших текстовых файлов также может быть долгим и зависит от размера и объема текстового файла и мощности компьютера.

Все файлы сохранил в архив Файлы13.rar

Пробуйте.

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

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