ASP clássico: A melhor maneira de ler e escrever arquivos grandes (5MB +) usando FileSystemObject

StackOverflow https://stackoverflow.com/questions/1675422

  •  16-09-2019
  •  | 
  •  

Pergunta

All,

Eu estou trabalhando em um aplicativo que permite que os usuários autorizados a fazer upload de planilhas do Excel para o nosso servidor.

Uma vez que são carregados, há um script ASP clássico que lê os dados na planilha do Excel, faz um monte de validação, análise e manipulação, em seguida, grava os dados modificados para um arquivo de texto delimitado por tabulação.

Em seguida, ele chuta de um procedimento armazenado no SQL Server que 'inserção em massa' usos para carregar os dados em um banco de dados.

O processo todo funciona razoavelmente bem quando os arquivos são pequenos. Mas como eles se tornam maiores (15.000 linhas, 5+ mb), o script começa a tomar muito tempo para executar (60 + segundos).

Então, eu estou procurando maneiras de torná-lo mais eficiente / rápido / robusto.

A grosso modo, aqui está como o código parece agora:

'' # 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

Como você pode ver, todo o arquivo está sendo lido em uma variável chamada "linhas", quando então é despejado no arquivo de texto.

Existem alternativas melhores para isso? Por exemplo, eu deveria escrever a linha arquivo de texto por linha como eu lê-lo do Excel?

Outra possibilidade Eu considerei - lendo o arquivo do Excel em uma tabela temporária no SQL Server, e fazer toda a validação / manipulação lá. O único problema é que não consigo encontrar um equivalente a 'inserção em massa' -. Eu acho que eu poderia ter para ler a linha de dados por linha no Excel, e, em seguida, escrevê-lo linha por linha na tabela Temp no SQL Server

Muito obrigado antecipadamente para qualquer conselho e discernimento!

Foi útil?

Solução

O que está matando você é tudo concatenação da string. Um simples passo seria para intercalar a leitura linha e chamadas para WriteLine no arquivo de texto. Você só iria segurar as string do tamanho de uma linha de cada vez.

Algo assim: -

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

Outras dicas

Concordo com Anthony, o trabalho em arrumar essa seqüência Concat. Toda vez que você adicionar à corda (linhas = linhas & Row) sua caros, pois tem de criar toda uma série nova e tentar limpar o antigo, mais e mais e mais. E o espaço necessário mais e mais. Por isso, esforça-se para encontrá-lo, portanto, o tempo todo.

Você pode querer olhar em usar GetRows em seu conjunto de registros, que poderia fazer todas as coisas a guia para você em uma chamada e retorna uma grande seqüência de idade.

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

Ele foi projetado para facilmente (e rapidamente) tornar as tabelas HTML et al de dados. Nada dizendo que você não pode usá-lo para tornar a uma lista TAB'ed também. Deve trabalhar um deleite embora eu nunca usei-o com uma folha de cálculo.

Este documento parece dizer a sua possível que:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top