Ler dados separados em txt Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Ler dados separados em txt

Post by thalesduarte » 15 Aug 2022, 12:04

Olá, boa tarde.

Gostaria de saber como posso para separar dados de uma linha especifica

Exemplo:

Tenho essa linha com varios campos divididos por PIPES.

Como posso isolar esses campos?
Deixando claro que os dados mudarão a todo momento, menos a estrutura.

|0110|C230412153|CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|AVENIDA CABO BRANCO|1|2|CABO BRANCO|

Queria isolar os dados para pegar o nome CLAUDIA MENDONÇA S e o Avenida Cabo Branco.

sofista
Posts: 645
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Ler dados separados em txt

Post by sofista » 15 Aug 2022, 14:10

Olá. Assumindo que os campos requeridos estão sempre na mesma posição:

Code: Select all

str := " |0110|C230412153|CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|AVENIDA CABO BRANCO|1|2|CABO BRANCO|"
arr := StrSplit(str, "|")
MsgBox, % arr[4] "`n" Format("{:T}`n", arr[11])

garry
Posts: 3740
Joined: 22 Dec 2013, 12:50

Re: Ler dados separados em txt

Post by garry » 15 Aug 2022, 14:14

obrigado sofista
loop example

Code: Select all

dlm:="|"
var=                  ;- for test
(ltrim join`r`n
|0110|C230412153|1-CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|1-AVENIDA CABO BRANCO|1|2|CABO BRANCO|
|0110|C230412153|2-CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|2-AVENIDA CABO BRANCO|1|2|CABO BRANCO|
|0110|C230412153|3-CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|3-AVENIDA CABO BRANCO|1|2|CABO BRANCO|
)
Loop,parse,var,`n,`r
  {
  LR=%A_loopfield%
  h:=StrSplit(lr,dlm)
  nome:=h[4],rua:=h[11]
  e .= nome . "---" . rua . "`r`n"
  }  
msgbox,%e%
;fileappend,%e%,test55.txt,utf-8
exitapp

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ler dados separados em txt  Topic is solved

Post by Gio » 15 Aug 2022, 19:07

Eu costumo fazer assim para organizar arquivos desse tipo:

Supondo que um arquivo contenha 1 registro por linha, e que cada registro seja composto de 13 campos separados por pipes, temos:

Code: Select all

Text = 
(
|0110|C230412153|1-CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|1-AVENIDA CABO BRANCO|1|2|CABO BRANCO|
|0990|C230412153|2-JOAO FRANCISCO|1059|0|66205041473|2|2507508|0|2-AVENIDA CABO AMARELO|1|2|CABO AMARELO|
|0999|C230412153|3-JOSE SILVA|1060|0|66205041474|3|2507509|0|3-AVENIDA CABO PRETO|1|2|CABO PRETO|
)

; Uso um stringsplit para separar o texto em linhas. Cada linha contém 1 registro.
StringSplit, REGISTRO_, Text,  `n

;Uso um loop sobre o total de registros (o totalizador é sempre o item 0 da array que o stringsplit criou) para separar cada registro em campos. Cada registro contém 13 campos.
Loop % REGISTRO_0
{
	; Uso as duas linhas abaixo para remover os pipes iniciais e finais de cada registro (para que a separação não comece e nem termine com um campo vazio).
	StringTrimRight, REGISTRO_%A_INDEX%, REGISTRO_%A_INDEX%, 1
	StringTrimLeft, REGISTRO_%A_INDEX%, REGISTRO_%A_INDEX%, 1
	
	; Já a linha abaixo serve para separar o conteúdo de cada registro em seus campos...
	StringSplit, REGISTRO_%A_INDEX%_CAMPO_, REGISTRO_%A_Index%, |
}

; A partir daqui tudo fica indexado de forma bem organizada...

;Campo 3 do registro 1:
msgbox % REGISTRO_1_CAMPO_3

; Campo 10 do registro 2:
msgbox % REGISTRO_2_CAMPO_10

; Campo 1 do registro 3:
msgbox % REGISTRO_3_CAMPO_1

imhere
Posts: 2
Joined: 17 Aug 2022, 17:20

Re: Ler dados separados em txt

Post by imhere » 17 Aug 2022, 19:14

Usando o código do garry como base, duas sugestões seriam o uso de objects para agrupar os dados como alternativa ao código do Gio, e o salvamento e recuperação dos dados utilizando biblioteca JSON.

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

#include <JSON> ;veja https://github.com/cocobelgica/AutoHotkey-JSON caso tenha interesse em salvar dados 
; salvar script com UTF-8 with BOM

dlm:="|"
var=                  ;- for test
(ltrim join`r`n
|0110|C230412153|1-CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|1-AVENIDA CABO BRANCO|1|2|CABO BRANCO|
|0110|C230412153|2-CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|2-AVENIDA CABO BRANCO|1|2|CABO BRANCO|
|0110|C230412153|3-CLAUDIA MENDONÇA S|1058|0|66205041472|1|2507507|0|3-AVENIDA CABO BRANCO|1|2|CABO BRANCO|
)
lista:={}
Loop,parse,var,`n,`r
  {
  LR=%A_loopfield%
  h:=StrSplit(lr,dlm)
  lista.Push({})
  lista[A_Index].nome:=h[4]
  lista[A_Index].rua:=h[11]
  lista[A_Index].cidade:=h[14]
  }  

Loop % lista.maxindex()
msgbox % lista[A_index].nome . "`n" . lista[A_index].rua . "`n" . lista[A_index].cidade

pessoa:=lista[1]
msgbox % "nova key pessoa.nome " . pessoa["nome"]
pessoa.telefone:="(001)555-0001" ;acrescentando keys ao novo objeto

if pessoa.HasKey("telefone")
    msgbox % pessoa.telefone

arquivo:=JSON.Dump(pessoa) ;serializar a variavel
FileAppend, % arquivo, % "dados.json", UTF-8 ; salva em um arquivo

;para recuperar os dados sem precisar fazer o "parse" novamente
;FileRead, json, % "dados.json"
;pessoa:=JSON.Load(json)
;pessoa.nome já estará disponível

exitapp

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Ler dados separados em txt

Post by thalesduarte » 18 Aug 2022, 11:39

Obrigado pela ajuda de todos, consegui adquirir um vasto conhecimento com essas informações.
Grato!!!

Post Reply

Return to “Ajuda e Suporte Geral”