Классический ASP: лучший способ чтения и записи больших (5 МБ+) файлов с использованием FileSystemObject.

Все,

Я работаю над приложением, которое позволяет авторизованным пользователям загружать электронные таблицы Excel на наш сервер.

После того, как они загружены, есть классический сценарий ASP, который считывает данные в электронной таблице Excel, выполняет ряд проверок, синтаксический анализ и манипуляции, а затем записывает измененные данные в текстовый файл с разделителями табуляцией.

Затем он запускает хранимую процедуру в SQL Server, которая использует «массовую вставку» для загрузки данных в базу данных.

Весь процесс работает достаточно хорошо, когда файлы небольшие. Но по мере того, как они становятся больше (15 000+ строк, 5+ МБ), скрипт начинает выполняться очень долго (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, а затем записывать их построчно в таблицу Temp в SQL Server.

Заранее большое спасибо за любой совет и понимание!


person mattstuehler    schedule 04.11.2009    source источник


Ответы (2)


Что вас убивает, так это конкатенация строк. Простым шагом было бы чередовать чтение строки и вызовы 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
person AnthonyWJones    schedule 04.11.2009
comment
Антон - Большое спасибо! Вы, наверное, уже знали об этом, но это сократило время обработки примерно на 98%. - person mattstuehler; 04.11.2009

Согласитесь с Энтони, поработайте над тем, чтобы привести в порядок этот String Concat. Каждый раз, когда вы добавляете к строке (строки = строки и строки), это дорого, так как приходится создавать совершенно новую строку и пытаться очистить старую снова, снова и снова. И космос нуждался в этом все больше и больше. Поэтому он изо всех сил пытается найти его, следовательно, все время.

Возможно, вы захотите изучить использование GetRows в своем наборе записей, который мог бы сделать все для вас за один вызов и вернуть большую старую строку.

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

Он был разработан, чтобы легко (и быстро) отображать HTML-таблицы и другие данные. Ничто не говорит о том, что вы не можете использовать его для отображения списка TAB. Должно работать удовольствие, хотя я никогда не использовал его с электронной таблицей.

Этот документ, кажется, говорит, что это возможно:

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

person Pete Duncanson    schedule 04.11.2009