Página 1 de 1
Como ler de .TXT e criar matriz
Enviado: 03 Jan 2016 20:40
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.
Como ler de .TXT e criar matriz
Enviado: 03 Jan 2016 22:33
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
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.
Como ler de .TXT e criar matriz
Enviado: 03 Jan 2016 22:55
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?
Como ler de .TXT e criar matriz
Enviado: 04 Jan 2016 00:28
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.
Como ler de .TXT e criar matriz
Enviado: 04 Jan 2016 09:00
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.
Como ler de .TXT e criar matriz
Enviado: 04 Jan 2016 11:01
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é+
Como ler de .TXT e criar matriz
Enviado: 04 Jan 2016 13:05
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
Como ler de .TXT e criar matriz
Enviado: 04 Jan 2016 14:30
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!
Como ler de .TXT e criar matriz
Enviado: 05 Jan 2016 16:24
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.
Como ler de .TXT e criar matriz
Enviado: 05 Jan 2016 16:52
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).
Como ler de .TXT e criar matriz
Enviado: 23 Mai 2016 18:10
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
Como ler de .TXT e criar matriz
Enviado: 30 Mai 2016 18:56
por asimoes
A minha solução é simples: harbour
Como ler de .TXT e criar matriz
Enviado: 21 Mai 2024 03:53
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!!
Como ler de .TXT e criar matriz
Enviado: 21 Mai 2024 09:25
por alxsts
Olá!
Ler conteúdo de arquivo INI.
Habitue-se a utilizar o recurso de busca do forum.