#arrays #automation #vbscript #hp-uft
Вопрос:
У меня есть большой текстовый файл (1 длинная строка) с несколькими разделителями (например: ~
, *
, :
). ~
Разделитель помечает новый раздел, а разделители *
и :
-подразделы или сегменты.
Я попытался сделать следующее, но получил ошибку несоответствия типов, вероятно, потому Split
, что функция предназначена для использования со строкой, а не с массивом.
Dim strFileLine, arrSection, arrSegment, arrSegField
strFileLine = "C:sometextfile.txt"
arrSection = Split(strFileLine, "~")
arrSegment = Split(arrSection, "*")
arrSegField = Split(arrSegment, ":")
Я пытаюсь использовать эту логику, чтобы сохранить мои сегменты и поля сегментов с правильным разделом и вставить эти значения в базу данных.
Есть идеи о том, как я могу сделать это с помощью VBScript?
Комментарии:
1. Появляется ли каждый разделитель только ОДИН РАЗ? в каждой строке текста?
2. @Tondray — легко сказать, чего вы не должны ожидать/делать: присвоение спецификации файла переменной не приведет к загрузке содержимого файла; Функция Split() разберет строку на массив подстрок, разделенных разделителем (т. е. разделителем), но не применит эту операцию ко всем элементам массива. Но вы должны предоставить сжатый образец ваших входных данных и некоторые подсказки о том, как вы планируете использовать (иерархические?) Проанализированные данные. Имеет ли формат файла хорошо известное имя/стандарт?
Ответ №1:
Решение зависит от того, как поля должны быть импортированы в базу данных. Если вы просто хотите обработать все поля в том порядке, в каком они отображаются во входном файле, вы можете заменить разделительные символы новыми строками, а затем разделить строку на новые строки:
Set fso = CreateObject("Scripting.FileSystemObject")
Set text = fso.OpenTextFile("C:sometextfile.txt").ReadAll
text = Replace(text, "~", vbNewLine)
text = Replace(text, "*", vbNewLine)
text = Replace(text, ":", vbNewLine)
arr = Split(text, vbNewLine)
For Each field In arr
WScript.Echo field
Next
Если вам нужно уделить больше внимания структуре входного файла, вы можете обработать входную строку вложенными циклами:
Set fso = CreateObject("Scripting.FileSystemObject")
Set text = fso.OpenTextFile("C:sometextfile.txt").ReadAll
For Each segment In Split(text, "~")
For Each section In Split(segment, "*")
For Each field In Split(section, ":")
WScript.Echo field
Next
Next
Next
Для получения дополнительной помощи вам потребуется предоставить дополнительную информацию о том, как иерархическая структура должна быть импортирована в базу данных, как Эккехард.Хорнер уже указывал.
Комментарии:
1. Большое вам спасибо! Это очень помогает.
Ответ №2:
Dim strFileLine
Dim arrSection()
Dim arrSegment()
Dim arrSegField()
Dim strBuf
Dim counta
Dim character
dim sectioncount
dim segmentcount
dim segfieldcount
strFileLine = "aaaaa~00000?AAAAA:bbbbb~11111?BBBBB:ccccc~22222?CCCCC:ddddd~33333?DDDDD:eeeee~44444?EEEEE:fffff~55555?EEEEE:"
strBuf = ""
For counta = 1 To Len(Trim(strFileLine))
character = Mid(strFileLine, counta, 1)
Select Case character
Case "~"
sectioncount = sectioncount 1
redim preserve arrSection(sectioncount - 1)
arrSection(sectioncount-1)=strBuf
strBuf = ""
Case "?"
segmentcount = segmentcount 1
redim preserve arrSegment(segmentcount - 1)
arrSegment(segmentcount-1)=strBuf
strBuf = ""
Case ":"
segfieldcount = segfieldcount 1
redim preserve arrSegField(segfieldcount - 1)
arrSegField(segfieldcount-1)=strBuf
strBuf = ""
Case Else
strBuf = strBuf amp; character
End Select
Next
For counta = 0 To ubound(arrSection)-1
document.Write("SECTION:=" amp; arrSection(counta) amp; "<br/>")
Next
For counta = 0 To ubound(arrSegment)-1
document.Write("SEGMENT:=" amp; arrSegment(counta) amp; "<br/>")
Next
For counta = 0 To ubound(arrSegField)-1
document.Write("SEGFIELD:=" amp; arrSegField(counta) amp; "<br/>")
Next
Ответ №3:
Чтобы получить пятые части (5-й раздел / 5-й сегмент / 5-й Сегфилд), которые отсутствуют в решении Zaf, -1 должен быть удален из циклов FOR. Например:
redim preserve arrSection(sectioncount)
arrSection(sectioncount) = strBuf
sectioncount = sectioncount 1
strBuf = ""
For counta = 0 To ubound(arrSection) 'REMOVE -1 from here
document.Write("SECTION " amp; counta amp; " : " amp; arrSection(counta) amp; "<br>")
Next
(То же самое для сегмента и Segfield).
(Также : последние 6 символов в strFileLine (EEEEE:) должны гласить FFFFF: )
Во всяком случае, Заф прекрасно показал, что при небольших данных повторное сохранение происходит довольно быстро !
(Его решение может быть сохранено в виде файла HTM для тестирования (в режиме IE10 при использовании IE))