【问题标题】:reading a CSV file with asp getting null values用asp读取CSV文件获取空值
【发布时间】: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


【解决方案1】:

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

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

Set sImportFile = fsoImport.CreateTextFile(sFileName, True)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2017-11-09
    • 2019-03-09
    • 2012-05-23
    相关资源
    最近更新 更多