【发布时间】:2015-06-14 23:37:43
【问题描述】:
我正在使用经典的 asp 将数据导入 MySQL 数据库,但是我遇到了一些麻烦,即使 CSV 文件中存在这些字段,我的代码将值返回为 NULL
由于我想将 CSV 文件作为记录集打开,我首先必须获取远程 csv 文件,然后在本地保存副本并创建 schema.ini 文件,然后使用 ADODB 连接打开文件,然后我想在将信息写入我的数据库之前浏览记录并对其进行操作。
所以我首先像这样使用 MSXML2.ServerXMLHTTP 抓取文件
sImportURL = "http://somewebsite/somecsvfile.csv"
Set objXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objXMLHTTP.Open "GET", sImportURL, False
objXMLHTTP.setRequestHeader "User-Agent", Request.ServerVariables("HTTP_HOST")
objXMLHTTP.Send ""
sResponse = split(objXMLHTTP.responseText, vbcrlf)
Set objXMLHTTP = Nothing
sResponse 是一个已经设置好的数组,然后使用 split 将文件的每一行添加到数组中。到目前为止一切顺利!
现在我使用 FSO 循环遍历数组并在本地创建一个 CSV 文件并为它创建一个架构文件
Set fsoImport = CreateObject("Scripting.FileSystemObject")
sFolder = Server.MapPath("/TempImport/")
If Not fsoImport.FolderExists(sFolder) Then sFSO.CreateFolder(sFolder)
sFileName = Server.MapPath("/TempImport/Import.csv")
If fsoImport.FileExists(sFileName) Then fsoImport.DeleteFile(sFileName)
Set sImportFile = fsoImport.CreateTextFile(sFileName, ForWriting, True)
For i = 0 to uBound(sResponse)
sImportFile.Writeline sResponse(i)
Next
sImportFile.Close
Set sImportFile = Nothing
sFileName = Server.MapPath("/TempImport/schema.ini")
If fsoImport.FileExists(sFileName) Then fsoImport.DeleteFile(sFileName)
Set sSchemaFile = fsoImport.CreateTextFile(sFileName, false)
sSchemaFile.WriteLine("[Import.csv]")
sSchemaFile.WriteLine("ColNameHeader=True")
sSchemaFile.WriteLine("Format=CSVDelimited")
sSchemaFile.WriteLine("Col1=SKU Text")
sSchemaFile.WriteLine("Col2=Quantity Double")
这也成功了,csv文件看起来像这样
SKU,Quantity
"TEK",0
"KDL-60LX903",3
"BICBIRO",88
"WB001",10
现在我打开我刚刚使用 ADODB 连接创建的文件
Set adoOpen = Server.CreateObject("ADODB.Connection")
adoOpen.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=/TempImport/;Extensions=asc,csv,tab,txt;HDR=NO;Persist Security Info=False"
adoOpen.Open
sSQL = "SELECT * FROM `Import.csv`"
Set rsOpenRS = Server.CreateObject("ADODB.Recordset")
rsOpenRS.Open sSQL, adoOpen
Do While Not rsOpenRS.EOF
sField = "SKU"
sValue = rsOpenRS(sField)
Response.Write sField & " = " & sValue & "<br />"
sField = "Quantity"
sValue = rsOpenRS(sField)
Response.Write sField & " = " & sValue & "<br />"
rsOpenRS.MoveNext
Loop
rsOpenRS.Close
Set rsOpenRS = nothing
Set adoOpen = nothing
现在,即使我的 CSV 文件中包含数据,写入屏幕的所有内容都是
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
SKU =
Quantity =
请注意,CSV 文件中有 10 组结果,只有 5 行,包括标题,我不太确定发生了什么,有人知道吗?
干杯
【问题讨论】:
-
您有
sSchemaFile.WriteLine("ColNameHeader=True"),然后在您的连接字符串中,HDR=NO。你的 csv 文件有列标题吗?
标签: csv text vbscript asp-classic adodb