MAIS UMA DE ARQUIVO TEXTO
Salve, Salve pessoal......
Bem é o seguinte, ja montei a minha própria estrutura de layout de arquivo texto(Head,BODY E TRAILLER), a geração do arquivo já esta ok.
Agora eu pergunto. Como ler apenas uma linha, seja ela qual for, Por exemplo :
Preciso jogar os dados da 1Âê linha em um form, para verificar se esta tudo ok e gravar na tabela.
A primeira linha ficou assim.
0143004145319000166PERFUMARIA REGINA 22/11/2006000005
ONDE:
01 = TIPO DE REGISTRO - HEADER (POSIÇÃO DE 1 A 2)
430 = CODIGO DA EMPRESA (POSIÇÃO DE 3 A 5)
04145319000166 = CNPJ (POSIÇÃO DE 6 A 19)
PERFUMARIA REGINA = RAZÃO SOCIAL (POSIÇÃO DE 20 A 50)
22/11/2006 = DATA (POSIÇÃO DE 51 60)
000005 = NUMERO DO PEDIDO (POSIÇÃO DE 61 A 66)
é ISSO AE.
Bem é o seguinte, ja montei a minha própria estrutura de layout de arquivo texto(Head,BODY E TRAILLER), a geração do arquivo já esta ok.
Agora eu pergunto. Como ler apenas uma linha, seja ela qual for, Por exemplo :
Preciso jogar os dados da 1Âê linha em um form, para verificar se esta tudo ok e gravar na tabela.
A primeira linha ficou assim.
0143004145319000166PERFUMARIA REGINA 22/11/2006000005
ONDE:
01 = TIPO DE REGISTRO - HEADER (POSIÇÃO DE 1 A 2)
430 = CODIGO DA EMPRESA (POSIÇÃO DE 3 A 5)
04145319000166 = CNPJ (POSIÇÃO DE 6 A 19)
PERFUMARIA REGINA = RAZÃO SOCIAL (POSIÇÃO DE 20 A 50)
22/11/2006 = DATA (POSIÇÃO DE 51 60)
000005 = NUMERO DO PEDIDO (POSIÇÃO DE 61 A 66)
é ISSO AE.
Eu faria assim
Dim Linha as string
Open Caminho_De_Seu_Arquivo for Input as #1
Line Input #1, Linha
Close #1
Aqui peguei a primeira linha, para tratar então vc usa o mid
TipoDeRegistro = mid(Linha, 1,2)' 1 é a posição inicial, 2 e qtde de caracteres a pegar
CodigoDaEmpresa = mid(Linha,3,3)
CNPJ = mid(Linha,6,13)
Dim Linha as string
Open Caminho_De_Seu_Arquivo for Input as #1
Line Input #1, Linha
Close #1
Aqui peguei a primeira linha, para tratar então vc usa o mid
TipoDeRegistro = mid(Linha, 1,2)' 1 é a posição inicial, 2 e qtde de caracteres a pegar
CodigoDaEmpresa = mid(Linha,3,3)
CNPJ = mid(Linha,6,13)
hummm vou tentar, e se eu necessitar pegar a linha 29 por exemplo
Dim strRegistro as string
Dim intLoop as integer
Dim intNumLinha as Integer
intNumLinha = Inputbox("Digite o numero da linha a buscar:")
Open "C:\Arquivo.txt" for Input as #1
For intLoop = 1 to intNumLinha
Line Input #1, strRegistro
Next intLoop
Close #1
MsgBox "Na linha " & CStr(intNumLinha) & "Contém:" & vbLF & strRegistro
"hummm vou tentar, e se eu necessitar pegar a linha 29 por exemplo"
Bom dia, bom sobre seu problema nosso amigo MARCELO já resolveu, a rotina que ele passou concerteza irá funcionar, e para vc pegar a linha 29 faça um laço com e vai incrementando um contador, ai quando contador for = 29 vc terá a linha 29, OBS: inicie o contador com 1.
Bom dia, bom sobre seu problema nosso amigo MARCELO já resolveu, a rotina que ele passou concerteza irá funcionar, e para vc pegar a linha 29 faça um laço com e vai incrementando um contador, ai quando contador for = 29 vc terá a linha 29, OBS: inicie o contador com 1.
OK...
Agora veja bem....
Como meu arquivo esta estruturado com HEAD,BODY E TRAILLER, minha duvida é ,como pegar os registro que iniciem com 03 (no caso o TRAILLER).Possivelmente este registro será apenas uma linha e será a última linha.
Abaixo segue a estrutura do arquivo.
0143004145319000166PERFUMARIA REGINA 23/11/2006000006
02000301TINT PRETO 000000010000000006270000000627
02000304TINT CASTANHO MEDIO 000000010000000006270000000627
030000160000023649000002364
Observerm os 02 primeiros caracteres das linhas, eles definem o timpo de registro, sendo assim o tipo de registro 03 e o fechamento do pedido, ou seja, a totalização dos produtos.
os tipos de registro 01 e 03 jogarei em um form, ja o tipo 02 irá para um grid.
Agora veja bem....
Como meu arquivo esta estruturado com HEAD,BODY E TRAILLER, minha duvida é ,como pegar os registro que iniciem com 03 (no caso o TRAILLER).Possivelmente este registro será apenas uma linha e será a última linha.
Abaixo segue a estrutura do arquivo.
0143004145319000166PERFUMARIA REGINA 23/11/2006000006
02000301TINT PRETO 000000010000000006270000000627
02000304TINT CASTANHO MEDIO 000000010000000006270000000627
030000160000023649000002364
Observerm os 02 primeiros caracteres das linhas, eles definem o timpo de registro, sendo assim o tipo de registro 03 e o fechamento do pedido, ou seja, a totalização dos produtos.
os tipos de registro 01 e 03 jogarei em um form, ja o tipo 02 irá para um grid.
Faça assim
Open Caminho_De_Seu_Arquivo for Input as #1
While not EOF(1)
Line Input #1, Linha
TipoDeRegistro = mid(Linha, 1,2)' 1 é a posição inicial, 2 e qtde de caracteres a pegar
If TipoDeRegistro = "03" then
MsgBox "Tipo de Registro 03"
'aqui vc faz o que tem que fazer com a linha do tipo 03
end if
Wend
Close #1
Marcelo, por enquanto obrigado, deu certo, soh mais uma coisinha.
um dos resultados q obtenho é : 0000024495 que seria igual á 244,95
ja tentei formatar assim
Existe alguma outra forma de formatar a expressao 0000024495 para 244,95
um dos resultados q obtenho é : 0000024495 que seria igual á 244,95
ja tentei formatar assim
Format(Mid(Linha, 9, 10), "##,##0.00") ' resultado 24.945,00
FormatCurrency(Mid(Linha, 9, 10),2) ' resultado R$ 24.495,00
Format(Mid(Linha, 9, 10),"Currency")' idem ao de cima
ccur(Mid(Linha, 9, 10)) ' resultado 24495
Existe alguma outra forma de formatar a expressao 0000024495 para 244,95
Public Function ConverterStringParaDouble(Numero As String) As Double
Dim sInteiro As String, sDecimal As String
If Trim(Numero) = "" Then
ConverterStringParaDouble = 0
Exit Function
End If
sInteiro = Left(Numero, Len(Numero) - 2)
sDecimal = Right(Numero, 2)
ConverterStringParaDouble = CDbl(sInteiro & "," & sDecimal)
End Function
usa essa função:
Numero = ConverterStringParaDouble("0000000024495")
--------------------------------------------------------
Quanto a primeira situação, acho melhor esse jeito (sem desprezar as dicas dos amigos) pq fica mais prático de trabalhar com as linhas:
Dim iArquivo As Integer
Dim sTexto As String
Dim aDados As Variant
'ler arquivo texto
Open sFile For Input As iArquivo
sTexto = Input(LOF(iArquivo), iArquivo)
Close iArquivo
'---------------------------------------------------
aDados = Split(sTexto, vbCrLf)
'---------------------------------------------------
Para saber qual informação tá em qual linha, só fazer
msgbox aDados(Nº da Linha - 1)
ou seja, linha 3 = aDados(2)
dá até pra saber quantas linhas tem no arquivo:
msgbox (UBound(aDados) - LBound(aDados)) + 1
se quiser checar o que tem em cada linha, faça assim:
For i = Lbound(aDados) to UBound(aDados)
if len(aDados(i)) > 2 then
select case Mid(aDados(i), 1, 2)
case "01", "02":
'joga no seu form
case "03":
'joga no seu GRID
end select
end if
Next
Só estou citando esses meios porque ficam muito mais PERFOMANTES.
Você joga o arquivo texto inteiro de uma vez só na memória (Array) e trabalha com os indices o quanto quiser.
O ganho de acesso/tempo é MUITO maior, principalmente se tiver que ficar lendo o arquivo toda hora, como deve ser o caso dele.
Citação:Quanto a primeira situação, acho melhor esse jeito (sem desprezar as dicas dos amigos) pq fica mais prático de trabalhar com as linhas:
Concordo plenamente com o Lion. Muito mais fácil e prático da maneira como ele falou.
Porém de qualquer forma como vc vai ter que fazer o for em cima do array criado para verificar o tipo do registro, acho que da na mesma do modo como eu fiz, com o While...
Marcelo, foi mal.. eu tava me justificando o porque de usar do jeito que eu falei alterando o tópico enquanto vc respondia ^^
Bom, REBOBINAAAAAAANDO:
-----------------------------------
Bom, REBOBINAAAAAAANDO:
-----------------------------------
Citação:Lion o lindão escreveu:
Só estou citando esses meios porque ficam muito mais PERFOMANTES.
Você joga o arquivo texto inteiro de uma vez só na memória (Array) e trabalha com os indices o quanto quiser.
O ganho de acesso/tempo é MUITO maior, principalmente se tiver que ficar lendo o arquivo toda hora, como deve ser o caso dele.
Tópico encerrado , respostas não são mais permitidas