Asp classic 经典ASP:阅读和阅读的最佳方式;使用FileSystemObject编写大型(5mb+;)文件

Asp classic 经典ASP:阅读和阅读的最佳方式;使用FileSystemObject编写大型(5mb+;)文件,asp-classic,filesystemobject,Asp Classic,Filesystemobject,全部, 我正在开发一个应用程序,允许授权用户将Excel电子表格上传到我们的服务器 上传后,会有一个经典的ASP脚本读取Excel电子表格中的数据,执行一系列验证、解析和操作,然后将修改后的数据写入以制表符分隔的文本文件 然后,它启动SQL Server中的一个存储过程,该存储过程使用“大容量插入”将数据加载到数据库中 当文件很小时,整个过程运行得相当好。但是当它们变大(15000多行,5+mb)时,脚本开始需要很长的时间运行(60多秒) 因此,我正在寻找使其更高效/更快/更健壮的方法 大致上,

全部,

我正在开发一个应用程序,允许授权用户将Excel电子表格上传到我们的服务器

上传后,会有一个经典的ASP脚本读取Excel电子表格中的数据,执行一系列验证、解析和操作,然后将修改后的数据写入以制表符分隔的文本文件

然后,它启动SQL Server中的一个存储过程,该存储过程使用“大容量插入”将数据加载到数据库中

当文件很小时,整个过程运行得相当好。但是当它们变大(15000多行,5+mb)时,脚本开始需要很长的时间运行(60多秒)

因此,我正在寻找使其更高效/更快/更健壮的方法

大致上,代码现在是这样的:

'' # read the uploaded Excel file

set objConnection = Server.CreateObject("ADODB.Connection") 
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsfile & ";Extended Properties=""Excel 8.0;"""
set objRS = objConnection.execute("Select * from [Sheet1$]")
rows = ""
while (not objRS.EOF and Err.Number = 0)
    row = objRS("col1") & vbTab & objRS("col2") & vbTab ... objRS("coln") & vbCrLF
    rows = rows & row
    objRS.MoveNext
wend
objRS.close

'' # Write the file
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(txtFile, 2, true)
objFile.WriteLine rows
objFile.Close
set objFSO = nothing
set objFile = nothing
如您所见,整个文件被读入一个名为“rows”的变量,然后被转储到文本文件中

有更好的替代方案吗?例如,我应该在从Excel读取文本文件时逐行写入文本文件吗

我考虑过的另一种可能性是将Excel文件读入SQL Server中的临时表中,并在其中执行所有验证/操作。唯一的问题是,我找不到与“批量插入”等效的方法—我想我可能必须在Excel中逐行读取数据,然后逐行将其写入SQL Server中的临时表中


非常感谢您的建议和见解

让你头疼的是所有的字符串连接。一个简单的步骤是在文本文件上交错行读取和WriteLine调用。您在任何时候都只能作为一行大小的字符串保存

大概是这样的:-

set objConnection = Server.CreateObject("ADODB.Connection") 
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsfile & ";Extended Properties=""Excel 8.0;"""
set objRS = objConnection.execute("Select * from [Sheet1$]")
set objFSO = CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.OpenTextFile(txtFile, 2, true)

do until objRS.EOF
    tab = ""
    for each fld in objRS.Fields
        objFile.Write tab
        objFile.Write fld.value
        tab = vbTab
    next
    objFile.Write vbCrLf
    objRS.MoveNext
loop
objRS.close
objConnection.Close
objFile.Close

同意Anthony的意见,把绳子整理好。每次添加到字符串(rows=rows&row)都会很昂贵,因为它必须创建一个全新的字符串,并尝试一次又一次地清理旧字符串。空间越来越需要它。因此,它一直在努力寻找它

您可能希望研究在记录集中使用GetRows,这可以在一个调用中完成所有选项卡的工作,并返回一个大的旧字符串

它的设计目的是方便(快速)呈现HTML表格等数据。并没有说你们不能用它来呈现一个标签列表。虽然我从来没有在电子表格中使用过它,但它应该很有用

这份文件似乎说这是可能的:


安东尼-非常感谢!您可能已经知道了这一点,但这将处理时间减少了约98%。