чтение csv-файла в vbscript


Я использую функцию ниже, чтобы прочитать текстовый файл, который имеет формат ниже. Мне нужно найти идентификатор (column1) и дату возврата (column2). Я не могу понять, что не так с моим кодом. Так что мой код работает идеально до readline,но некоторые, как это не зацикливается. Так что в основном он просто проверяет входящие consumerSSN только с первым SSN из файла txt. Поэтому, если я передаю getDOH(213396391), он возвращает пробел ("") вместо соответствующей даты.

sraDOH.txt:
578171533,2015-01-01 00:00:00
213396391,2015-06-01 00:00:00
077966385,2015-01-01 00:00:00
216418521,2015-01-01 00:00:00


Function getDOH(consumerSSN)
    dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
    dim doh, t, x
    For Each File In fso.GetFolder(fso.GetAbsolutePathName("..Test Files")).Files
        If File.Name = "sraDOH.txt" Then
            Set tsIn2 = fso.OpenTextFile(File, 1)
            Do While Not tsIn2.AtEndOfStream
                doh = tsIn2.ReadLine
                t = split(doh,",")
                If consumerSSN = t(0) Then
                    getDOH = t(1)
                Else 
                    getDOH = ""
                End If
            Loop
        End If
    Next
End Function
3 3

3 ответа:

Кроме того: вы никогда не должны сравнивать значения различных (под) типов в VBScript. Поэтому ваш вызов getDOH(213396391) рискован; он должен быть getDOH("213396391"), потому что Split() приводит к строкам.

Доказательства:

>> Function doCmp(v)
>>   s = "213396391,2015-06-01 00:00:00"
>>   t = Split(s, ",")
>>   doCmp = v = t(0)
>> End Function
>> WScript.Echo CStr(doCmp(213396391)), CStr(doCmp("213396391"))
>>
False True

Вы должны выйти из цикла, как только найдете искомое значение.

Непроверенные:

Function getDOH(consumerSSN)
    dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
    dim doh, t, x, f

    f = fso.GetAbsolutePathName("..\Test Files\") & "\sraDOH.txt"

    If fso.fileexists(f) then 

        Set tsIn2 = fso.OpenTextFile(File, 1)
        Do While Not tsIn2.AtEndOfStream
            doh = tsIn2.ReadLine
            t = split(doh,",")
            If consumerSSN = t(0) Then
                getDOH = t(1)
                exit do
            End If
        Loop

    End If

End Function

Приведенная ниже функция основана на аналогичной функции, которую я использую для поиска старого идентификатора продукта и замены его идентификатором продукта для нашей новой системы. Это также требует, чтобы входной файл имел строку заголовка, например:

'sraDOH.txt:
'SSN, DOH
'578171533,2015-01-01 00:00:00
'213396391,2015-06-01 00:00:00
'077966385,2015-01-01 00:00:00
'216418521,2015-01-01 00:00:00

Function getDOH(consumerSSN)

Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim iConnection                 'Connection objects for input
Dim iRecordset                  'RecordSets for input
Dim dDOH                        ' date to look up   
Dim sInputFileDir               ' Directory containing the TXT file to process
Dim sInputTXT                   ' Name of the TXT file to open (without a pathname)

sInputFileDir = fso.GetAbsolutePathName("..\Test Files\")
sInputTXT = "sraDOH.txt"

'
'Open text file
'   

Set iConnection = CreateObject("ADODB.Connection")
Set iRecordset = CreateObject("ADODB.Recordset")

' Open a txt file using ODBC
iConnection.Provider = "MSDASQL"
iConnection.Open "Driver={Microsoft Text Driver (*.txt; *.csv)}; DBQ=" & sInputFileDir & "\;"


iRecordset.Open "SELECT DOH FROM sraDOH.txt Where SSN = "& consumerSSN, _
        iConnection, adOpenStatic, adLockOptimistic, adCmdText

dDOH = iRecordset("DOH")

If IsNull(dDOH) Or dDOH = "" Then
    stdout.WriteLine "ERROR: Bad date on record for: "& consumerSSN
End If

iRecordset.Close
iConnection.Close

getDOH = dDOH

End Function    

Вот моя исходная функция:

Function setInvoiceLineItemRefListID(dpassedProductID)

Dim iConnection                 'Connection objects for input
Dim iRecordset                  'RecordSets for input
Dim dProductID                  'Foundry Product ID
Dim dListID                     'Quickbooks Online Product ID
Dim sInputFileDir               ' Directory containing the CSV file to process
Dim sInputCSV                   ' Name of the CSV file to open (without a pathname)

' Spreadsheet columns
'productID, sproductAbbrev, sechoDataItemNumber, sQBItemCode, slistID

sInputFileDir = "C:\ThinkwellApps\Programs"

sInputCSV = "products.csv"          'Name of the spreadsheet containing the list of ProductIDs

'
'Open spreadsheet
'   

Set iConnection = CreateObject("ADODB.Connection")
Set iRecordset = CreateObject("ADODB.Recordset")

' Open a CSV file  
iConnection.Provider = "MSDASQL"
iConnection.Open "Driver={Microsoft Text Driver (*.txt; *.csv)}; DBQ=" & sInputFileDir & "\;"


iRecordset.Open "SELECT ListID FROM products.csv Where ProductID = "& dpassedProductID, _
        iConnection, adOpenStatic, adLockOptimistic, adCmdText

dListID = iRecordset("ListID")

If IsNull(dListID) Or dListID = "" Then
    stdout.WriteLine "ERROR: Bad listID for: " & dpassedProductID

iRecordset.Close
iConnection.Close

setInvoiceLineItemRefListID = dListID
End Function