Como ler de .TXT e criar matriz

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Como ler de .TXT e criar matriz

Mensagem por rmlazzari »

Antes de mais nada, que 2016 seja só sucesso a todos!


E vamos lá:
Mensagens para o sistema num arquivo.txt (cada linha é de um tamanho):

Sim,1
Nao,2
Quer sair do sistema?,3
Encontrei um erro irrecuperavel. Vide mensagem 123 no maual. Tecle algo para abandonar.,4

O que estou fazendo:
adbf := {}
aadd(adbf( 'linha' , 'c' , 254 , 0})
aadd(adbf( 'numero' , 'c' , 1 , 0})
dbcreate( 'temp.dbf', adbf )
use temp.dbf
append blank from arquivo.txt delimited with ","
qtos := lastrec()
index on numero to temp
mens := {}
for i = 1 to qtos
...aadd(mens,{val(mens->numero),alltrim(temp->linha)})
next
clos temp
delete file temp.dbf
delete file temp.ntx
quit

Funciona... bem, pelo menos houver apenas 9 mensagens. Daria para aumentar temp->numero e indexar por val(numero) ou até definir numero como numérico mesmo mas não é essa a minha questão. Será que não estou indo de Uberlândia a Uberaba via Manaus? Será que não há nada que leia direto do arquivo.txt e leve para dentro da array direto, mesmo sendo cada linha um tamanho? Algo com memoread, memoline, mlcount, mlpos ou mesmo com fopen, fread, freadstr, fseek... Na verdade nem precisaria os números no arquivo.txt, bastaria manter a ordem, escrever novas mensagens sempre embaixo da última e terminá-las sempre com um ENTER, de fim de linha, já que as arrays já têm um número de elemento...

Acho que vi uns exemplos assim mas faz muito tempo, será que alguém sabe?

Grato.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ler de .TXT e criar matriz

Mensagem por JoséQuintas »

Explicação enrolada mas tudo bem.

Não ficaria muito mais fácil ao contrário?

1,sim
2,não
3,alguma coisa

Se quer importação direta, use um delimitador único, vírgula vai ter nas mensagens.

Ou, simples, e prático, número em primeiro com 6 dígitos fixos.

000001Sim
000002Não
000003Alguma Coisa

Código: Selecionar todos

APPEND FROM arquivo.TXT SDF
Na estrutura o código com 6 dígitos, e o texto à vontade.

E a propósito.... se deixou o número com tamanho de um único caractere, é óbvio que não cabe o número 10 e acima.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Como ler de .TXT e criar matriz

Mensagem por rmlazzari »

Grato, José Quintas, mas o principal é que eu gostaria de evitar carregar o TXT para o DBF e só depois carregar do DBF para a array, que é a forma que pretendo usar no sistema. Não estou certo mas acho que dá para carregar direto do disco, em TXT, para a array...
Além do que, na remota hipótese de alguém querer jogar Sudoku em outro idioma, o trabalho seria apenas traduzir o TXT e nos sets do programa marcar a opção POB (Português do Brasil), já que estou desenhando o sistema para que esses arquivos de idiomas sejam, por exemplo, LANG.POB para Português do Brasil, LANG.POR, para Português de Portugual, LANG.ENG para inglês e assim por diante, para facilitar na hora da escolha (directory() + achoice()).
Não sei se é algo muito importante para Sudoku mas quem sabe para programas mais sérios... poder mudar uma tabela TXT diretamente, sem precisar passar por nenhum programa para levar as info para DBF...


OFF TOPIC: Como estou retomando o Clipper, tenho dado uma sapiada no Harbour e no xHarbour mas estou cheio de dúvidas:

Qual dos dois é o melhor? E qual a versão mais estável de cada uma? O que mudam, além da portabilidade (como se isso fosse pouco, mas...) em relação ao bom e velho Clipper? São difíceis de usar? Algum deles oferece mouse "nativo", diretamente? Algum tem recurso para usar memória RAM do Windows - aqueles absurdos de 2GB e até mais) ou apenas um pouco mais dos 640 do DOS? Algum oferece a possibilidade de criar telas como as janelas do Windows, do Ubuntu etc? Ambos são free? Onde encontro para baixar?
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como ler de .TXT e criar matriz

Mensagem por Jairo Maia »

Olá rmlazzari,
rmlazzari escreveu:poder mudar uma tabela TXT diretamente, sem precisar passar por nenhum programa para levar as info para DBF...
Veja se o exemplo abaixo ajuda:

Código: Selecionar todos

Local x, cArq, nQtdLin, cLinha
Public cHelp:={}

cArq := "LANG.POB"  // nome do arquivo a carregar

cArq := MemoRead( cArq )
nQtdLin := MlCount( cArq )

For x=1 To nQtdLin
  cLinha := RTrim( MemoLine( cArq, 254, x ) )
  // Alert( cLinha )  // caso queira checar a linha...
  AaDd( cHelp, cLinha )
Next
rmlazzari escreveu:tenho dado uma sapiada no Harbour e no xHarbour mas estou cheio de dúvidas: Qual dos dois é o melhor?
Qual é o melhor, particularmente não sei dizer, porém, atualmente o mais usado é o Harbour.

Quanto as demais dúvidas, no fórum há várias discussões sobre isso, algumas inclusive até a exaustão.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ler de .TXT e criar matriz

Mensagem por JoséQuintas »

Usar mais de 640KB?????
Fica limitado ao sistema operacional. Em 32 bits limitado a 4GB.

O Harbour gerencia melhor a memória e multithread.
E tem bibliotecas gráficas pra Windows.

Se o objetivo do txt for pra tradução, o Harbour tem funções próprias pra isso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Como ler de .TXT e criar matriz

Mensagem por ANDRIL »

Criei uma função para ler arquivo INI, porem pode ser utilizado também em TXT. Ela lê o arquivo e joga na matriz. O arquivo a ser lido tem que ter até 64kb limite de leitura do clipper, ou até 4096 linhas limite de array no clipper.

Código: Selecionar todos

******************************************************************************
function IniToArray(cfile)
* carrega o arquivo e retorna um array com preenchido com as linhas do arquivo
******************************************************************************
local ar_tmp:={}
string=memoread(cfile)
linhas=mlcount(string)
for i = 1 to linhas
    if !empty(memoline(string,80,i))
       aadd(ar_tmp,memoline(string,80,i))
    endif
next
if len(ar_tmp)=0
aadd(ar_tmp," ")
endif
return ar_tmp
Aqui a função que faz a busca dos dados na matriz.

Código: Selecionar todos

******************************************************************************
function IniObtemDados(arrayini,variavel,cChave)
* arrayini -> array carregado com as linhas do ini, obtido pela funcao IniToArray
* variavel -> string correspondente ao parametro a ser buscado no INI
* cChave   -> string que representa a chave dentro do INI [ECF]
*             Por compatibilidade, se a chave nao for informada faz a busca apenas
*             pelo conteudo dado em variavel.
*
* return      caso tenha encontrado a variavel no array, retorna o valor
*             ou "" caso nao tenha encontrado
*
* ARQ.INI  [ECF]
*          modelo=Todos
*
* USO a=IniObtemDados(meuarray,"modelo")
*     ? a   //Todos
* 
******************************************************************************
local posicao:=ascan(arrayini,{|x| alltrim(upper(x))=alltrim(upper(variavel))}),retorno:=""
totele=len(arrayini)
chavecerta=.f.
set exact on
if !empty(cChave)
	
	for i = 1 to totele
      *@24,00 say arrayini[i]
      *@23,00 say chavecerta
		if left(arrayini[i],1)="[".and.upper(cChave)==upper(alltrim(arrayini[i]))	
		  chavecerta=.t.    
		elseif left(arrayini[i],1)="[".and.cChave!=alltrim(arrayini[i])	
		  chavecerta=.f.
		endif
		if chavecerta=.t.
			//if alltrim(upper(variavel))$upper(arrayini[i])
			if alltrim(upper(variavel))==upper(substr(arrayini[i],0,at("=",arrayini[i])-1))
			retorno:=alltrim(substr(arrayini[i],at("=",arrayini[i])+1))
			exit
			endif
		endif
		*inkey(.5)
	next
	
else //se nao for informado a chave para obter a varivel especifica
	if posicao>0
		retorno:=alltrim(substr(arrayini[posicao],at("=",arrayini[posicao])+1))
	endif
endif
set exact off
return retorno
Seu arquivo TXT deve ser criado no padrao CODIGO DA MENSAGEM=MENSAGEM
00001=Seja bem vindo
00002=Confirma saida do sistema?
...
Uso:
meuarray = IniToArray("LANG.POR")
frase = IniObtemDados(meuarray,"00002")
? frase

// sera impresso - Confirma saída do sistema?
Inclusive se não for muitos dados (respeitando o limite de 64kb do Clipper para MemoRead) pode-se colocar as linguagens em um único arquivo criando chaves para identificar cada grupo de linguagem. Exemplo do TXT:

[PT]
00001=Olá
[ES]
00001=Hola
[EN]
00001=Hello

meuarray = IniToArray("TXT")
frase = IniObtemDados(meuarray,"00001","EN")
? frase

//sera impresso - Hello
Até+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como ler de .TXT e criar matriz

Mensagem por JoséQuintas »

Se continuar com Clipper, e com Txt, também pode usar fOpen, fSeek, fReadStr, etc.
Deixe o txt com tamanho de linha fixo, assim posiciona direto aonde interessa.
Neste caso não vai poder pular número.
o registro 1 estaria na posição 1, registro 2 na posição 101, etc.
Só posicionar diretamente em 100 * número - 99
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Como ler de .TXT e criar matriz

Mensagem por rmlazzari »

Grato a todos.
A solução do Jairo Maia e a do ANDRIL são a que estava procurando. MEMOREAD + MLCOUNT... Eu não me lembrava que o MLCOUNT reconhece 0dh e 0ah como final de linha. E nem terei que usar o número da mensagem, já que as matrizes têm esse número, cada elemento é numerado... E as dicas do José Quintas, muito legais.

Grato novamente!
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como ler de .TXT e criar matriz

Mensagem por Jairo Maia »

Olá rmlazzari,

Que bom que resolveu.

Sobre isso:
rmlazzari escreveu:Eu não me lembrava que o MLCOUNT reconhece 0dh e 0ah
Primeiro, não é minúsculo, é maiúsculo: 0D e 0A, e o h no final significa que você está se referindo a EXADECIMAL.

Para Clipper e [x]Harbour em Windows é simplesmente: Chr(13)+Chr(10). Ou seja, quebra de linha e retorno de carro.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Como ler de .TXT e criar matriz

Mensagem por alxsts »

Olá!

Só para ficar na ordem certa: os caracteres 13 + 10 em decimal ou 0D + 0A em hexadecimal enviam respectivamente os comandos CR (carriage return = retorno do carro) e LF (line feed = incremento de linha).
[]´s
Alexandre Santos (AlxSts)
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Como ler de .TXT e criar matriz

Mensagem por Claudio Soto »

En Harbour existe:

HB_ATokens()
Splits a string into tokens based on a delimiter.
Syntax
HB_ATokens( <cString> , ;
[<cDelimiter>] , ;
[<lSkipQuotes>] , ;
[<lDoubleQuotesOnly>] ) --> aTokens

Arguments
<cString>
This is a character string which is tokenized based on the value of <cDelimiter>.
<cDelimiter>
A single character can be specified as delimiter used to tokenize the string <cString>. It defaults to a blank space (Chr(32)).
<lSkipQuotes>
This parameter defaults to .F. (false). When it is set to .T. (true), all portions of <cString> enclosed in single or double quotes are not searched for <cDelimiter>.
<lDoubleQuoteOnly>
The parameter is only relevant when <lSkipQuotes> is .T. (true). When <lDoubleQuoteOnly> is also .T. (true), only portion sof <cString> enclosed in double quotes are not searched for <cDelimiter>. Return
The function returns an array of character strings.
Description
HB_ATokens() function splits <cString> into substrings, based on the value of <cDelimiter>. The delimiter is removed from <cString> and the resulting substrings are collected in an array, which is returned.
If <lSkipQuotes> is .T. (true), a quoted substring within <cString> is not split if it contains the delimiter sign. If the value of <lSkipQuotes> is .F. (false), which is the default, the quoted substring will be split, regardless of the quotes. The <lDoubleQuoteOnly> argument specifies if both the double and single quote signs are interpreted as a quote sign (.F.) or only the double quote is recognized as a quote sign (.T.).
Info
See also: At(), AtToken(), IN, Left(), Rat(), Right(), SubStr()
Category: Array functions , Character functions , Token functions
Source: vm\arrayshb.c

Example
// The example displays the result of HB_ATokens() using different
// combinations for <lSkipQuotes> and <lDoubleQuoteOnly>

PROCEDURE Main
LOCAL cString := [This\'_is\'_a_tok"e_n"ized_string]
LOCAL aTokens := {}
LOCAL i

aTokens := HB_ATokens( cString, "_", .F., .F. )

FOR i := 1 TO Len( aTokens )
? aTokens
NEXT
// Result: array with 6 elements
// This\'
// is\'
// a
// tok"e
// n"ized
// string

aTokens := HB_ATokens( cString, "_", .T., .F. )

FOR i := 1 TO Len( aTokens )
? aTokens
NEXT
// Result: array with 4 elements
// This\'_is\'
// a
// tok"e_n"ized
// string

aTokens := HB_ATokens( cString, "_", .T., .T. )

FOR i := 1 TO Len( aTokens )
? aTokens
NEXT
// Result: array with 5 elements
// This\'
// is\'
// a
// tok"e_n"ized
// string
RETURN
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Como ler de .TXT e criar matriz

Mensagem por asimoes »

A minha solução é simples: harbour
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
deividdjs
Usuário Nível 3
Usuário Nível 3
Mensagens: 377
Registrado em: 19 Set 2006 09:39
Localização: Foz do Iguaçu / Pr

Como ler de .TXT e criar matriz

Mensagem por deividdjs »

Buenas muchachos!!

Help please!!

Preciso criar uma função pra procurar e extrair de um arquivo .ini por exemplo o ip e a porta que vem sempre depois do delimitador ‘=‘ .. jogar em uma variável para que eu possa acessar esse servidor ..

E da mesma forma a partir de configurações do sistema .. procurar essas posições dos mesmo dentro do arquivo e salvar no arquivo .ini

.. a sequência sempre é assim:

Ip = 127.0.0.1
Server = x.x.x.x
Porta = xxxx

E etc…

Remumindo hehhe do arquivo pro sistema // do sistema pro arquivo

Saludos!!
Windows 11 + Harbour 3.2 + MINGW64 gcc 14.1.0 + Visual Lib + GTWVG + LETODBF WINDOWNS/LINUX
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Como ler de .TXT e criar matriz

Mensagem por alxsts »

Olá!

Ler conteúdo de arquivo INI.

Habitue-se a utilizar o recurso de busca do forum.
[]´s
Alexandre Santos (AlxSts)
Responder