GARANTIR DESCONTO

Fórum Novo em Dephi - como abrir um txt e gerar ou csv separado por ; #419729

11/07/2012

0

Boa tarde!
Sou novo em delphi, pretendo achar ate mesmo um curso e aproveitando quem souber de um curso ate mesmo on-line de delphi completo também ajuda !!!

Mais minha duvida é o seguinte tenho um arquivo em txt e queria abrir ele e criar um campo para cada string tipo assim:

Ex txt.
0001ORLANDO DE OLIVEIRA 1131540786
0002ROBERTO SANTOS SILVA1185645254
0003MARIA JOSÉ CUNHA 1185233469

e converte-lo para :

0001;ORLANDO DE OLIVEIRA ;11-3154-0786
0002;ROBERTO SANTOS SILVA;11-8564-5254
0003;MARIA JOSÉ CUNHA ;11-8523-3469

Criando tipo uma tabela!
Desde já agradeço


William Calisto

William Calisto

Responder

Posts

11/07/2012

Bruno Leandro

voce tem que saber as posições dos textos no arquivo txt, ex
codigo da coluna 1 ate coluna 4, nome da coluna 5 ate 55, telefone da 56 ate 64
ou exista algum caracter especial dividindo os campos de forma similar ao ; do modelo cvs

uma forma de fazer eh carregar o txt em um tstringlist e ir copiando as linhas e adicionando o separado de campos o ;

qualquer duvida estou a disposicao
Responder

Gostei + 0

11/07/2012

Deivison Melo

Responder

Gostei + 0

11/07/2012

William Calisto

Entao BRUNO LEANDRO no arquivo que tenho ele tem um layout das posiçoes, usando o exemplo que dei seria:

0001ORLANDO DE OLIVEIRA 1131540786
0002ROBERTO SANTOS SILVA1185645254
0003MARIA JOSÉ CUNHA 1185233469


cod := GetString(linha,1,4);
nome:= GetString(linha,5,24);
tel :- GetString(linha,25,35);

minha duvida seria, como colocar ela dentro do script, por que aqui na empresa uso um programa que ultiliza um pascal diferente para gerearmos boleto, ele tiraria uma string de arquivo txt e colocaria no desenho do boleto, mais tem arquivo que nao vem formatado, tipo com separado, la ultizariamos um script desse tipo para carregar cada possição


while Readln(s) <> eof them
Begin

BeginPage(PAGE1);
PAGE1.REC1.CODIGO := GetString(S,1,4);
PAGE1.REC1.NOME := GetString(S,5,24);
PAGE1.REC1.TELEFONE := GetString(S,25,35);
WriteRecord(PAGE1,REC1);
EndPage(PAGE1);

end;

eu queria saber como faço isso no delphi!
Ah e desde ja agradeço a vcs !!!
Responder

Gostei + 0

11/07/2012

Edson Melo

ola Lian-88, o arquivo original e voce quem monta ou e montado por um programa de terceiro, se e voce que monta deixe o campo num tamanho padrao, ex nome com 40 caracteres, se o nome não tiver os 40 caracteres, tem uma funcao para completar os caracteres ate chegar a 40, depois use o comando copy para selecionar os 40 caracteres da posicao do nome; Ex copy(strin, posicao inicial, tamanho) ====> copy(label1.caption, 10,40) ==== pega a string que esta no Label1.caption, com inicio da posicao 10, contando 40 caracteres para frente, isto se o arquivo original for montado por voce, se não for pelo que sei, posso estar errado mas não tem condições de ser feita pois a string com nome tem tamanho variavel, nunca se tera a posiçaõ final a ser usada para captura.

ja usei esta dica em sistema meu, so que os dois arquivos eram meu sistema que montava

espero que tenha te feito pensar um pouco
Responder

Gostei + 0

11/07/2012

Cauê Nishijima

Olá Lian-88,
Você pode criar uma classe (ex.: TRegistro) pra definir cada registro, e utilizar TAttributes definir a propriedade de cada campo(posicao,tamanho,tipo,obrigatoriedade,etc), depois disso é possivel criar uma classe maior (TCollectionRegistros) que recebe uma coleção de TRegistro e tenha uma function que receba um arquivo TXT e retorne um arquivo CSV.

Qualquer dúvida entre em contato
Abraços
Cauê Nishijima
Responder

Gostei + 0

12/07/2012

William Calisto

ola Lian-88, o arquivo original e voce quem monta ou e montado por um programa de terceiro, se e voce que monta deixe o campo num tamanho padrao, ex nome com 40 caracteres, se o nome não tiver os 40 caracteres, tem uma funcao para completar os caracteres ate chegar a 40, depois use o comando copy para selecionar os 40 caracteres da posicao do nome; Ex copy(strin, posicao inicial, tamanho) ====> copy(label1.caption, 10,40) ==== pega a string que esta no Label1.caption, com inicio da posicao 10, contando 40 caracteres para frente, isto se o arquivo original for montado por voce, se não for pelo que sei, posso estar errado mas não tem condições de ser feita pois a string com nome tem tamanho variavel, nunca se tera a posiçaõ final a ser usada para captura.

ja usei esta dica em sistema meu, so que os dois arquivos eram meu sistema que montava

espero que tenha te feito pensar um pouco


Bom dia Edson garcia de melo,
Então essa parte ate entendi, como falei la em cima eu sei como fazer no pascal no programa como utilizamos, porem queria desenvolver um programa em delphi para criar separador em arquivo remessa de banco.
Qual o problema que acontece para que eu tenha que fazer isso é o seguinte, nosso programa ele gera boletos de iptu, iss, etc ... tem prefeitura que envia o arquivo já delimitado com o cabeçalho e tudo certo, tem outras que envia o arquivo remessa do banco, que é um arquivo que um contribuinte pode ter mais de uma linha e não tem delimitador, porem os campos são padrão, cada um tem seu devido tamanho que seguimos para elaborar o script.
So que eu preciso transformar esse arquivo de banco que não é delimitado e o contribuinte pode ter linhas variáveis em um arquivo delimitado e por linha, como um csv.
Eu só queria saber como consigo carregar um arquivo txt no delphi e salvar o mesmo arquivo com delimitador.
Só com isso consigo elaborar as condições necessárias para fazer o que eu preciso.
no basico mesmo so queria um pequeno exemplo que eu pudesse olhar e interpretar a logica utilizada, não achei nada na net, as vezes é pq eu nao procurei direito ou com palavras errada.
pq algumas coisa eu sei so nao sei montar o script tipo

var
SDiretorio: string;
TEntrada, TSaida: TextFile;
ASBuffer: AnsiString;

sCodigo, sNome, sTelefone: String;
Begin
Readln(TEntrada, ASBuffer);

sCodigo :=copy(ASBuffer,1,4);
sNome :=copy(ASBuffer,5,24);
sTelefone :=copy(ASBuffer,25,35);

queria entender como montar a parte do while not eof(TEntrada) do Begin
....

você pode me ajudar nessa questão, so um exemplo mesmo! vamos dizer que é aquele momento em que penso penso e nao saio do lugar rsrs
Obrigado Edson garcia de melo




Responder

Gostei + 0

12/07/2012

Bruno Leandro

Ola uma forma de fazer eh utilizando o stringlist conforme o modelo a seguir

procedure teste;
var
slEntrada,slSaida: TStringList;
i: Integer;
begin
slEntrada := TStringList.Create;
slSaida := TStringList.Create;
slEntrada.LoadFromFile( ´c:\arquivo.txt´ );

for i := 0 to slEntrada.Count - 1 do
begin
slSaida.add( Copy(slEntrada[i],1,4) + ´;´ + Copy(slEntrada[i],5,24) + ´;´ + Copy(slEntrada[i],25,35) );
end;

slSaida.SaveToFile( ´c:\arquivoSaida.txt´ );

FreeAndNil( slEntrada );
FreeAndNil( slSaida );
end;
Responder

Gostei + 0

12/07/2012

William Calisto

Ola uma forma de fazer eh utilizando o stringlist conforme o modelo a seguir

procedure teste;
var
slEntrada,slSaida: TStringList;
i: Integer;
begin
slEntrada := TStringList.Create;
slSaida := TStringList.Create;
slEntrada.LoadFromFile( ´c:\arquivo.txt´ );

for i := 0 to slEntrada.Count - 1 do
begin
slSaida.add( Copy(slEntrada[i],1,4) + ´;´ + Copy(slEntrada[i],5,24) + ´;´ + Copy(slEntrada[i],25,35) );
end;

slSaida.SaveToFile( ´c:\arquivoSaida.txt´ );

FreeAndNil( slEntrada );
FreeAndNil( slSaida );
end;


Hum, Obrigado BRUNO LEANDRO,
vou tentar, mais vc já me deu uma luz já!
Se consegui posto aqui, mais brigado mesmo!
Agora so mais uma duvida, caso esteja tudo certo como faço para fechar esse topico?
E vc ou alguem conhece algum curso bom de delphi?


Responder

Gostei + 0

12/07/2012

William Calisto

BRUNO LEANDRO, nesse caso nao ultiliza while né pq eu sei que o eof ele iria ate a ultima linha do arquivo
Responder

Gostei + 0

12/07/2012

Bruno Leandro

se for utilizar variavel TextFile sim mas da forma que passei com TStringList é possivel fazer utilizando o for, pois a variavel stringlist.count tem a quantidade de linhas
Responder

Gostei + 0

23/07/2012

William Calisto

se for utilizar variavel TextFile sim mas da forma que passei com TStringList é possivel fazer utilizando o for, pois a variavel stringlist.count tem a quantidade de linhas


Vlw, muito obrigado ajudo e muito, funcionou certinho o que eu queria fazer.
só para tirar mais uma duvida, tem que fechar o tópico ou como faz?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar