Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

luiscarlos5046

[Resolvido] Importar dados de TXT

Recommended Posts

Olá Galera!

 

Preciso importar uns campos de um TXT que está assim:

 11111 ----- 2222222 22 222222222                      3333333333        444444    55555    66666    7777    8888888888
11111 ----- 2222222 22 22222222222 2 2222222222       33333333333333    444444  5555555   666666   77777    8888888888

 

O que delimita um dado de outro são estes espaços como está acima... não tem ponto e virgula.

O que acontece é que já antes de utilizar o MID() os textos já vem sem estes espaços e não consigo fazer a contagem das posições, pois tem linha que há mais caracteres em um campo que outro...

Onde quero pegar o ID, PRODUTO e LABORATÓRIO já defini as posições que desejo pegar os caracteres e a variável já está indo sem os vários espaços, ai a contagem não dá certo...

Na 2ª coluna tem nomes de produtos com espaços

 

11111 ----- 2222222 22 222222222 3333333333 444444 55555 66666 7777 8888888888

 

Estou utilizando este Script:

<%
call abrecon
Server.ScriptTimeout = 100000
on error resume next

response.write "<img src='loading11.gif'>"

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Dim varArquivo

Set varArquivo = objFSO.OpenTextFile(server.MapPath("db/lista.txt"), 1)

dim linha
Do while not varArquivo.AtEndOfStream
linha = varArquivo.ReadLine
'linha2 = " 11111 ----- 222222222222222222                      3333333333        444444    55555    66666    7777    8888888888"

id = mid(linha,2,6)
produto = mid(linha,14,52)
laboratorio = mid(linha,54,70)
devalor = mid(linha,78,86)
porvalor = mid(linha,87,95)


sqlInsert = " INSERT INTO produtos ( "
sqlInsert = sqlInsert & " 			   id, "
sqlInsert = sqlInsert & " 			   produto, "
sqlInsert = sqlInsert & " 			   devalor, "
sqlInsert = sqlInsert & " 			   porvalor, "
sqlInsert = sqlInsert & " 			   laboratorio "
sqlInsert = sqlInsert & " 			    ) "
sqlInsert = sqlInsert & "	VALUES   ( "	
sqlInsert = sqlInsert & " 	          '" & id &"', "
sqlInsert = sqlInsert & " 	          '" & produto &"', "
sqlInsert = sqlInsert & " 	          '" & devalor &"', "
sqlInsert = sqlInsert & " 	          '" & porvalor &"', "
sqlInsert = sqlInsert & " 	          '" & laboratorio &"' "
sqlInsert = sqlInsert & " 	          ) "

'Response.Write(linha2) & "<br>"
'Response.Write(sqlInsert)
Response.Write(id) & "<br>"
Response.Write(produto) & "<br>"
Response.Write(laboratorio) & "<br>"
Response.End()

'cn.execute(sqlInsert)

loop

varArquivo.Close
Set varArquivo = Nothing
Set objFSO = Nothing

rs.close()
set rs = nothing
call fechacon

if err > 0 then
response.write "<script>history.back(1);alert('Ocorreu algum problema na inserção.\nVerifique o layout do arquivo de texto.')</script>"
response.End()
end if

%>

 

O que posso fazer pra resolver isso?

 

Existe alguma forma mais simples de importar isso ?

 

Luis Carlos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu pensaria em soluções mais simples como por exemplo, quem te passou o arquivo txt se não tem como passar em outro formato com caracter delimitador (;., etc) porque fica praticamente impssível trabalhar com um arquivo sem um padrão.

Eu não sei se eu entendi bem o que você escreveu mas se for isso que eu entendi você tem um aquivo txt sem padrão sem espaço por exemplo:

vamos supor que id tenha o maximo de 5 caracteres, nome tenha 20, numero tenha 15 e serie tenha 8, então seu txt está assim:

id -nome - numero - serie

vamos supor que na primeira linha só tem o id preechido mas não tem nome nem numero e não tem caracter delimitador nem espaços,

00123456

e a segunda linha tenha tudo

01daniel43256000012

então as duas linhas ficarão assim

00123456

01daniel43256000012

como eu falei não tem como pegar isso porque não tem nada separando se ainda tivesse espaço nos campos em branco até que daria mas dessa forma eu desconheço, então meu conselho foi o que te passei acima, ve se você consegue uns arquivos txt melhores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou vocÊ poderia dar um replace nos espaços e substituir por um caracter para facilitar, mas seu arquivo txt esta meio que "bagubçado" e assim dificultando a ordem e lógica de posições

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae pessoal !

 

Olha só como é a estrutura do TXT realmente:

 46831 [___] ALGEST ACETONID+ENANT EST 150+10        EMS               50.00%     8.58     4.29       3    02/10/2011
47399 [___] AMILORIDA + HCTZ 2,5/25 MG 30 COM       EMS               50.00%     6.88     3.44      20    02/10/2011
47400 [___] AMILORIDA + HCTZ 5/50 MG 30 COMPR       EMS               50.00%    11.49     7.47      39    02/10/2011
47401 [___] AMILORIDA + HCTZ 5/50 MG C/30 CPR       GERMED            50.00%    11.25     7.31       4    02/10/2011
99884 [___] AMOXICILINA  250 MG 150ML               MULTILAB          58.58%    24.14    10.00      12    
99589 [___] AMOXICILINA 500MG 21 CAPSULAS           MULTILAB          71.09%    31.13     9.00      10    02/10/2011
49037 [___] ATENOLOL+CLORTALIDONA 100/25 MG C       MEDLEY            50.00%    31.56    20.51      11    02/10/2011
49047 [___] ATENOLOL+CLORTALIDONA 50/12,5 MG        MEDLEY            50.00%    19.71     9.85      27    02/10/2011
99702 [___] ATORVASTATINA CALCICA  10MG C/30        EMS               50.00%    61.82    40.18       7    02/10/2011
99631 [___] ATORVASTATINA CALCICA 20MG CX C/        EMS               50.00%    61.82    61.82       3    02/10/2011
99624 [___] ATORVASTATINA CALCICA 20MG CX C/        GERMED            50.00%    61.82    61.82       1    02/10/2011
99636 [___] ATORVASTATINA CALCICA 20MG CX C/        MEDLEY            50.00%    67.04    67.04       8    02/10/2011
99762 [___] ATORVASTATINA CALCICA 40 MG C/ 30       MEDLEY            50.00%   125.79   125.79       1    02/10/2011
99640 [___] ATORVASTATINA CALCICA 40MG CX C/3       EMS               50.00%   123.62   123.62       5    02/10/2011

 

Seguindo a idéia do xanburzum... se eu substituir todos os espaços maiores por pontos (.....) e após isso, fazer a captura dos dados seguindo as posições exatas... e nas variáveis que tiverem nomes com espaços... após pegar as variáveis, eu poderia substituir novamente os pontos por espaço... e retirar os espaços no final.

 

Vou ver a possibilidade de o sistema já exportar com o separador " ; "

Se o TXT fosse gerado com ; seria mais fácil...

Compartilhar este post


Link para o post
Compartilhar em outros sites

com certeza seria mais fácil e rápido se tivesse um caracter delimitador...

 

da onde você recebe esse txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal,

 

Primeiro de tudo, quero pedir DESCULPAS a todos pela minha ignorância e pelo mico.

De acordo com o formato do TXT acima segue o script funcionando certinho.

Eu usei o RTrim() e o LTrim() por causa dos espaços adicionais que deixei de cada lado, para caso haja algum campo com maior tamanho do previsto.

 

* Eu estava fazendo uma tremenda confusão com a função MID()... o MID() pega a posição inicial e a quantidade de caracteres que deseja... Eu estava usando Posição inicial e posição final... ai num dá certo mesmo.

O caso é que pra exibir os textos na tela, o browser não exibe os espaços, mas o script trata o conteúdo do TXT normalmente com os espaços, quantidade e posição com vários espaços.

 

Obrigado pela ajuda de todos!

 

<%
call abrecon
Server.ScriptTimeout = 100000
on error resume next

' mostra loading caso a operação demore pra terminar
response.write "<img src='loading11.gif'><br><br>"

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Dim varArquivo

Set varArquivo = objFSO.OpenTextFile(server.MapPath("db/lista.txt"), 1)

dim linha
Do while not varArquivo.AtEndOfStream
linha = varArquivo.ReadLine

id = RTrim(mid(linha,2,6))
produto = RTrim(mid(linha,14,40))
laboratorio = RTrim(mid(linha,54,18))
devalor = RTrim(LTrim(mid(linha,78,10)))
porvalor = RTrim(LTrim(mid(linha,87,10)))

sqlInsert = " INSERT INTO produtos ( "
sqlInsert = sqlInsert & " 			   id, "
sqlInsert = sqlInsert & " 			   produto, "
sqlInsert = sqlInsert & " 			   devalor, "
sqlInsert = sqlInsert & " 			   porvalor, "
sqlInsert = sqlInsert & " 			   laboratorio "
sqlInsert = sqlInsert & " 			    ) "
sqlInsert = sqlInsert & "	VALUES   ( "	
sqlInsert = sqlInsert & " 	          '" & id &"', "
sqlInsert = sqlInsert & " 	          '" & produto &"', "
sqlInsert = sqlInsert & " 	          '" & devalor &"', "
sqlInsert = sqlInsert & " 	          '" & porvalor &"', "
sqlInsert = sqlInsert & " 	          '" & laboratorio &"' "
sqlInsert = sqlInsert & " 	          ) "
cn.execute(sqlInsert)
loop



varArquivo.Close
Set varArquivo = Nothing
Set objFSO = Nothing

rs.close()
set rs = nothing
call fechacon

if err > 0 then
response.write "<script>history.back(1);alert('Ocorreu algum problema na inserção.\nVerifique o layout do arquivo de texto.')</script>"
response.End()
end if

%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.