Как читать файлы CSV внутри цикла, используя VBScript - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть 2 файла CSV, как показано ниже.

TEAMLIST.csv:

empid,name
54321,xyz
12345,abc

DATA.csv:

heading1,head2,head3,head4
54321-Process : GDPR_WBT,54321,Process : GDPR_WBT,TRUE
12345-Process : GDPR_WBT,12345,Process : GDPR_WBT,TRUE
54321-Fire Safety,54321,Fire Safety,FALSE
12345-Fire Safety,12345,Fire Safety,TRUE

Ниже приведен весь мой код VBScript,Проблема в том, что внутренний цикл работает нормально, но внешний цикл принимает только первую запись [54321, xyz], а не все записи.Не в состоянии понять, почему.

Option Explicit

Dim fs
Dim fs2
Set fs = CreateObject("Scripting.FileSystemObject")
Set fs2 = CreateObject("Scripting.FileSystemObject")

Dim EMPLOYEE
Dim DATA

Set EMPLOYEE = fs.OpenTextFile("TEAMLIST.csv")
Set DATA = fs2.OpenTextFile("DATA.csv")

Dim counter, line, EMP_ARRAY
Dim counter2, line2, DATA_ARRAY

counter = 0
counter2 = 0

Do While Not EMPLOYEE.AtEndOfStream
    line = EMPLOYEE.ReadLine
    counter = counter + 1

    If counter > 1 Then
        EMP_ARRAY = Split(line, ",")

        Do While Not DATA.AtEndOfStream '### DATA LOOP STARTS ###
            line2 = DATA.ReadLine
            counter2 = counter2 + 1

            If counter2 > 1 Then
                DATA_ARRAY = Split(line2, ",")

                If EMP_ARRAY(0) = DATA_ARRAY(1) Then
                    If DATA_ARRAY(2) = "Process : GDPR_WBT" Then
                        If DATA_ARRAY(3) = "" Then
                            DATA_ARRAY(3) = "FALSE"
                        End If
                        WScript.Echo EMP_ARRAY(0) & "--" & EMP_ARRAY(1) & "--" & DATA_ARRAY(2) & "--" & DATA_ARRAY(3)
                    End If

                    If DATA_ARRAY(2) = "Fire Safety" Then
                        If DATA_ARRAY(3) = "" Then
                            DATA_ARRAY(3) = "FALSE"
                        End If
                        WScript.Echo EMP_ARRAY(0) & "--" & EMP_ARRAY(1) & "--" & DATA_ARRAY(2) & "--" & DATA_ARRAY(3)
                    End If
                End If
            End If
        Loop '### DATA LOOP ENDS ###
    End If
Loop

EMPLOYEE.Close
DATA.Close
Set EMPLOYEE = Nothing
Set DATA = Nothing
Set fs = Nothing
Set fs2 = Nothing

1 Ответ

0 голосов
/ 23 апреля 2019

После первой итерации внешнего цикла внутренний цикл уже прочитал DATA.csv до конца.Чтобы «перемотать» этот файл для каждой итерации внешнего цикла, необходимо открыть / закрыть его внутри внешнего цикла.

Do Until EMPLOYEE.AtEndOfStream
    '...
    Set DATA = fs.OpenTextFile("DATA.csv")
    Do Until DATA.AtEndOfStream
        '...
    Loop
    DATA.Close
Loop

В качестве альтернативы (если файл достаточно мал), прочитайтеэто один раз в массив и внутренний цикл повторяется по этому массиву.

DATA = Split(fs.OpenTextFile("DATA.csv").ReadAll, vbNewLine)

Do Until EMPLOYEE.AtEndOfStream
    '...
    For Each line2 In DATA
        '...
    Next
Loop

Примечание 1: создание нескольких экземпляров FileSystemObject в вашем сценарии не имеет смысла.Создайте один экземпляр в начале вашего сценария и используйте его во всей оставшейся части кода.

Примечание 2: Do While Not неудобно.Вместо этого используйте Do Until.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...