MAIS UMA DE ARQUIVO TEXTO

LCSD 23/11/2006 09:38:11
#185866
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.


USUARIO.EXCLUIDOS 23/11/2006 09:43:51
#185870
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)

LCSD 23/11/2006 09:48:01
#185872
hummm vou tentar, e se eu necessitar pegar a linha 29 por exemplo

USUARIO.EXCLUIDOS 23/11/2006 10:08:28
#185873
  
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


USUARIO.EXCLUIDOS 23/11/2006 10:12:12
#185874
"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.
LCSD 23/11/2006 10:52:17
#185881
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.


USUARIO.EXCLUIDOS 23/11/2006 11:26:25
#185887
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

LCSD 23/11/2006 12:09:10
#185893
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

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
LIONHEART 23/11/2006 12:26:21
#185900
Resposta escolhida
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.
USUARIO.EXCLUIDOS 23/11/2006 12:30:27
#185901
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...
LIONHEART 23/11/2006 12:34:17
#185902
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:

-----------------------------------

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.


Página 1 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas