使用VBScript读取CSV文件

3

我正在使用以下函数读取一个文本文件,该文件的格式如下。 我需要查找id(列1)并返回日期(列2)。 我无法理解我的代码有什么问题。 因此,我的代码在readline之前运行得很完美,但不知何故它没有循环。 所以基本上它只检查来自txt文件的第一个SSN与传入的consumerSSN。 因此,如果我传递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

Kushal,你的代码存在许多陷阱,可能导致你无法解决问题。相对路径,请使用Option Explicit。fso在哪里被创建?添加Wscript.echo以确定正在运行和未运行的内容。VBA经常会默默失败,这很痛苦。此外,没有示例说明如何调用该函数,因此我们甚至不知道customerSSN是否等于任何值。希望这可以帮助到你。 - Dan Chase
我添加了fso。路径和一切都很正常。这是一个逻辑问题,在我已经花费了6个小时的工作后,我无法看到。希望能得到第二个人的帮助。如果由于缺乏信息而使您感到困惑,我很抱歉。 - imba22
1
尝试设置一个结果变量并中断,然后在结尾将函数名称设置为结果。也许设置返回值会导致函数退出。 - Dan Chase
3个回答

3

一旦找到所搜索的值,您应该退出循环。

未测试:

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

2
此外:在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

0
下面的函数基于我用来查找旧产品ID并将其替换为我们新系统中的产品ID的类似函数。这还要求输入文件具有标题行,例如:
'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    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接