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

时间:2009-11-04 17:33:27

标签: asp-classic filesystemobject

所有

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

一旦上传,就会有一个经典的ASP脚本,它会读取Excel电子表格中的数据,进行大量的验证,解析和操作,然后将修改后的数据写入制表符分隔的文本文件。

然后,它在SQL Server中使用“批量插入”将数据加载到数据库中。

当文件很小时,整个过程运行得相当好。但随着它们变大(15,000多行,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中的临时表,并在那里进行所有验证/操作。唯一的问题是我找不到“Bulk Insert”的等价物 - 我想我可能要在Excel中逐行读取数据,然后逐行将它写入SQL Server的Temp表中。

非常感谢任何建议和见解!

2 个答案:

答案 0 :(得分:4)

杀死你的是所有字符串连接。一个简单的步骤是将行读取和对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

答案 1 :(得分:3)

与Anthony达成协议,努力整理String Concat。每次添加到字符串(rows = rows& row)时,它都很昂贵,因为它必须创建一个全新的字符串并尝试一遍又一遍地清理旧字符串。这个空间越来越需要它。所以很难找到它,因此一直都在努力。

您可能希望在记录集上使用GetRows,它可以在一次调用中为您执行所有选项卡操作并返回一个很大的旧字符串。

http://www.aspdev.org/articles/asp-getrows/

它旨在轻松(并快速)呈现HTML表格等数据。没有什么可以说你不能用它来渲染TAB的列表。虽然我从未在电子表格中使用它,但应该是一种享受。

这个文件似乎说它可能是:

http://www.fontstuff.com/ebooks/free/fsADOConnectExcel.pdf