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

reading a CSV file with asp getting null values

我正在使用经典 asp 将数据导入 MySQL 数据库,但是我 运行 遇到了一些麻烦,即使这些字段存在于 CSV 文件中我的代码 returns 值为 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 行,包括 header,我不太确定发生了什么,有人知道吗?

干杯

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

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

Set sImportFile = fsoImport.CreateTextFile(sFileName, True)

当我用经典语言写这篇文章时 asp 我不需要 ForWriting 位,它没有给我一个错误,它只是不起作用。

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