чтение 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 ответа:
Кроме того: вы никогда не должны сравнивать значения различных (под) типов в 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