Функция разделения массива

#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))