使用asp获取空值读取CSV文件

时间:2015-04-09 14:27:04

标签: csv text vbscript asp-classic adodb

我使用经典的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行,包括标题,我不确定发生了什么,有人有任何线索吗?

干杯

1 个答案:

答案 0 :(得分:0)

好的,所以这只是一个愚蠢的问题,我改变了

Set sImportFile = fsoImport.CreateTextFile(sFileName, ForWriting, True)

Set sImportFile = fsoImport.CreateTextFile(sFileName, True)

当我在经典的asp中写这个时,我不需要ForWriting位,它没有给我一个错误它只是没有工作。

感谢所有试图提供帮助的人