Importar TXT com virgula

Delphi

05/05/2005

Pessoal estou com uma dificuldade para importar dados separados por virgula, tentei utilizar o codigo [url]http://forum.clubedelphi.net/viewtopic.php?t=53307&highlight=importar+dados+txt[/url] mas o programa trava depois que seleciono o arquivo TXT a ser importado.

Tentei procurar algo sobre TStringList pois me falaram q com ele tb da pra fazer, so que não achei nenhum exemplo para importar os dados.

são 5 campos q quero importar:
Nome
Endereco
Telefone
TelCel
Orcamento

Todos separados por virgula... se puderem solucionar minha duvida agradeço


Vagner.oliveira

Vagner.oliveira

Curtidas 0

Respostas

Vagner.oliveira

Vagner.oliveira

05/05/2005

sobe


GOSTEI 0
Antseralves

Antseralves

05/05/2005

Em primeiro lugar acredito que o uso de vírgula como separador
é uma escolha infeliz pois em caso de campos decimais no txt
os mesmos, dependendo de como está configurado o sistema,
deverão ser representados com vírgula, porem isso é outro assunto.

Acho que o exemplo abaixo poderá ajudar, naturalmente que com as
adaptações específicas do teu caso !.

Boa Sorte.


procedure TForm1.Button1Click(Sender: TObject);

var Lista : TStringList;
I,J,Li,Lf : integer;
L,Sub : String[80];
TipoCampo : TFieldType;
campo : Variant;

begin
Lista := TStringList.Create;
Lista.LoadFromFile(´Arquivo.TXT´); // Carrega o txt
Table1.EmptyTable; // Limpa a tabela.
Table1.Open;
for I := 0 to Lista.Count-1 do
begin
L := Lista.Strings[I]; // Só para escrever menos..
Lf := 0;
Li := 1;
J := 0;
Table1.Insert;
repeat
Lf := PosEx(´,´,L,Lf+1);
if Lf = 0 then
Lf := Length(L)+1;
Sub := Copy(L,Li,Lf-Li);
TipoCampo := Table1.Fields.Fields[J].DataType;
case TipoCampo of
ftSmallint, ftInteger,ftWord,ftBoolean : Campo := StrToInt(Sub);
ftFloat, ftCurrency : Campo := StrToFloat(Sub);
ftDate, ftTime, ftDateTime : Campo := StrToDateTime(Sub);
else
Campo := Sub;
end;
Table1.Fields.Fields[J].AsVariant := Campo;
Inc(J);
Li := Lf+1;
until Lf > Length(L);
Table1.Post;
end;
Table1.Close;
Lista.Free;
end;

Obs: Dê USES na unit [b:31a096aa89]StrUtils[/b:31a096aa89]


GOSTEI 0
Marco Salles

Marco Salles

05/05/2005

Ideia...

procedure TForm1.Button2Click(Sender: TObject); 
var 
Entrada: String; 
I : Integer; 
j:Integer; 
tamanho:Integer; 
begin 
  entrada:=MARIA DA SILVA,Rua do Perdido,3721-3678,9986-0861,500.30´; 
  tamanho:=Length(entrada); 
  j:=1; 
  i:=Pos(´,´,entrada); 
  Showmessage(Copy(Entrada,j,i-j));//Nome; 
  J:=J+i; 
  i:=Pos(´,´,copy(entrada,j,Tamanho)); 
  Showmessage(Copy(Entrada,j,i-1));//endereço; 
  j:=j+i;
  i:=Pos(´,´,copy(entrada,j,Tamanho)); 
  Showmessage(Copy(Entrada,j,i-1));//Telefone; 
  j:=j+i; 
  i:=Pos(´,´,copy(entrada,j,Tamanho)); 
  Showmessage(Copy(Entrada,j,i-1));//Celular ; 
  j:=j+i; 
  Showmessage(Copy(Entrada,j,tamanho-1));//Orcamento; 
end;


É Apenas uma idéia ... Voce deve fazer algumas adaptações... Rode e Veja

Analogia :arrow:
http://forum.clubedelphi.net/viewtopic.php?t=62359&highlight=&sid=d43a1ef52c07378a176d531ee312c76d


GOSTEI 0
Clenio

Clenio

05/05/2005

Gostaria de saber do Marco Salles, como se faz para importar os dados de um arquivo txt que não tenha nenhum delimitador nem [b:19c0d74b7c]´,´[/b:19c0d74b7c] nem [b:19c0d74b7c]´|´[/b:19c0d74b7c] e que os espaços entre os campos no arquivo texto não seguem um padrão, as vezes tem 2 espaços as vezes tem 4 ou 5 depende do tamanhno do nome. segue abaixo 7 linhas desse arquivo para você ver, so que a distancia dos campos ai em baixo estão todas iguais, mas no arquivo está diferente sem padronização.
espero ter sido entendido na minha explicação.



160168831910018ABADIA GOMES DOS SANTOS16/03/1964F05/05/2005MORRINHOSGO
203811051690005ABAEL DO PRADO RAMOS20/07/1977M05/05/2005MORRINHOSGO
206868110750006ABDIAS DA COSTA BARROS24/06/1951M05/05/2005MORRINHOSGO
125585252300000ABDIAS FERREIRA GONCALVES07/05/1971M05/05/2005MORRINHOSGO
209994597880001ABDINAM CIRQUEIRA MACIEL02/01/1979M05/05/2005MORRINHOSGO
207125532950007ABEDENINGO FELIX DA SILVA11/12/1970M05/05/2005MORRINHOSGO
123817698050007ABEL GAMA MADUREIRA01/07/1970M05/05/2005MORRINHOSGO


desde ja obrigado.


GOSTEI 0
Edilcimar

Edilcimar

05/05/2005

da maneira mostrada o limitador é número, letra, número, letra, ou seja vai alternando entre números e letras


GOSTEI 0
Antseralves

Antseralves

05/05/2005

Sem delimitadores e sem conhecer previamente a posição dos campos, aí fica difícil. Tenho um amigo que abriu o texto com um editor e saiu na base do COPIAR/COLAR :lol:


GOSTEI 0
Aerreira

Aerreira

05/05/2005

Sem delimitadores e sem conhecer previamente a posição dos campos, aí fica difícil. Tenho um amigo que abriu o texto com um editor e saiu na base do COPIAR/COLAR :lol:


Discordo do antseralves.

No seu caso, Clenio, bastaria usar o código exemplificado acima, porém com alguns ajustes, a saber:
- seu primeiro campo é numerico e de tamanho fixo seguido por um espaço;
- o segundo campo é um nome com ´n´ palavras e espaços, mas que tem como fixo o fato de ter como campo seguinte uma data, então basta localizar uma ´/´ e retornar 3 caracteres e terá o final do nome;
- o terceiro campo já estará localizado;
- o quarto campo é fixo (sexo = uma posição);
- o quinto campo é novamente uma data... basta seguir os mesmos procedimentos do terceiro campo;
- o sexto campo é o nome de uma cidade, que pode ter ´n´ palavras e espaços, mas novamente é seguida por uma sigla de estado, que será fixo e fácilmente identificável;
- o sétimo e último campo, é o estado.

Com alguns poucos ajustes no código exemplificado pelo Marco Salles você (Clenio) conseguirá facilmente importar seu TXT.


GOSTEI 0
Antseralves

Antseralves

05/05/2005

Concordo com o Adriano, desde qua o arquivo txt fosse simplesmente
o que extá [b:dca4e5378c]EXEMPLIFICADO[/b:dca4e5378c] pelo Clenio. Porem creio que esse não seja o caso. A solução deverá contemplar outros casos como por exemplo:

Se o sexto campo fosse referenta a uma cidade com nome de BREJO DA SE no estado de Alagoas ficaria assim:

BREJO DA SE AL

Pela solução proposta o SE seria confundido com o estade de Sergipe !.

Continuo achando que um txt sem uma formatação previamente conhecida não teremos uma solução facil para o problema.


GOSTEI 0
Kotho

Kotho

05/05/2005

Clenio... pelo que eu entendi da sua explicação, os campos tem tamanho fixo no arquivo!!! Isso porque vc disse que o texto que está aparecendo é diferente do que está no arquivo...

Se for isso é fácil... basta usar o Copy com números fixos de posição inicial e quantidade.


GOSTEI 0
Aerreira

Aerreira

05/05/2005

Se o sexto campo fosse referenta a uma cidade com nome de BREJO DA SE no estado de Alagoas ficaria assim: BREJO DA SE AL Pela solução proposta o SE seria confundido com o estade de Sergipe !. Continuo achando que um txt sem uma formatação previamente conhecida não teremos uma solução facil para o problema.


Agora sim, antseralves, concordo. Neste caso teríamos problemas, mas caso o arquivo tivesse sempre a mesma formatação bastaria considerar que o estado é sempre o último campo, então não teriamos esse problema do ´Brejo da Sé´.

O que o Clenio precisa é tomar uma desisão, afinal o arquivo é fixo ou não, pois depois de responder a esta mensagem encontrei outra dele dizendo que o arquivo tem delimitadores ´|´ o que já facilita em muito o processo de importação.

Um abraço a todos....


GOSTEI 0
Massuda

Massuda

05/05/2005

Pelo trecho do arquivo que o clenio copiou e colou no post dele, me parece que os campos do arquivo são [b:53caed98d7]separados por tabulações[/b:53caed98d7] (#9). Quem puder conferir, clica em ´citar´ no post do clenio e copia o trecho do arquivo para um editor de texto.


GOSTEI 0
Vagner.oliveira

Vagner.oliveira

05/05/2005

pessoal, alterei o codigo para o programa exportar os dados separador por ; (ponto e virgula), mas continuo tendo dificuldades....


GOSTEI 0
Antseralves

Antseralves

05/05/2005

Bem. Agora vc poderá tentar usar a rotina que enviei anteriormente,
só que trocando a linha;

Lf := PosEx(´,´,L,Lf+1); por Lf := PosEx(´;´,L,Lf+1);

Lembre de dá uses na unit [b:d60335ef23]StrUtils[/b:d60335ef23]

Testa e me diz se funcionou !. Boa sorte..

AntSer
=====


GOSTEI 0
Clenio

Clenio

05/05/2005

Bom dia a todos e obrigado pelo interesse em resolver esta questão,

Vou esclarecer alguns pontos que talvez possa ajudar:

Os campos da tabela estão assim:

[b:9b17ca81a7]Campo Tipo Tamanho[/b:9b17ca81a7]

Numero Alpha 15
Nome Alpha 50
DataNasc Data
Sexo Alpha 1
DataEmis Data
Municipio Alpha 30
UF alpha 2

O problema é que tenho um arquivo no Excel com mais de 30.000 Linhas e eu salvei este arquivo como txt para importar para o meu BD, que é paradox. [b:9b17ca81a7]O Marco Salles [/b:9b17ca81a7]me passou um codigo com delimitador [b:9b17ca81a7]´|´ [/b:9b17ca81a7]que funciona perfeitamente, so que o arquivo tem [b:9b17ca81a7]mais 30.000 linhas e fica dificil colocar o delimitador manualmente em todas as linhas.[/b:9b17ca81a7]

O problema está nos [b:9b17ca81a7]espaços entre os campos[/b:9b17ca81a7], exemplo o campo nome, porque o nome das pessoas não tem o mesmo tamanho alguns ocupam 15 espaços outros ocupam 40 o maximo e 50, acho que a questão está nos espaços que são de tamanhos variados entre os campos.
Espero ter esclarecido os companheiros, para que possam encontrar uma forma de me ajudar a resover este problema.

mais uma vez obrigado a todos .


GOSTEI 0
Edilcimar

Edilcimar

05/05/2005

o que eu falei antes
da maneira mostrada o limitador é número, letra, número, letra, ou seja vai alternando entre números e letras

continua válido


GOSTEI 0
Massuda

Massuda

05/05/2005

...O problema é que tenho um arquivo no Excel com mais de 30.000 Linhas e eu salvei este arquivo como txt...
Na minha opinião, quando você salvou como texto/CSV no Excel, configurou como caractere separador de campo (tabulação, caractere #9). Volte no Excel e configure para usar outro caractere que seja mais conveniente para você e salve novamente a planilha como texto/CSV.


GOSTEI 0
Antseralves

Antseralves

05/05/2005

Não afirmo com certeza mas parece que o EXCEL pode importar .txt,
dividir em colunas e adicionar um separador escolhido. Vê se isso é
verdade.

AntSer
=====


GOSTEI 0
Antseralves

Antseralves

05/05/2005

Respondendo aqui também...

Na unit do teu formulário vc deve incluir o uses na unit StrUtils.


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids,StrUtils;


Favor confirmar se recebeu essa msg.

Boa sorte !

AntSer
====


GOSTEI 0
Aerreira

Aerreira

05/05/2005

O problema é que tenho um arquivo no Excel com mais de 30.000 Linhas e eu salvei este arquivo como txt para importar para o meu BD, que é paradox. [b:3bfe467ed7]O Marco Salles [/b:3bfe467ed7]me passou um codigo com delimitador [b:3bfe467ed7]´|´ [/b:3bfe467ed7]que funciona perfeitamente, so que o arquivo tem [b:3bfe467ed7]mais 30.000 linhas e fica dificil colocar o delimitador manualmente em todas as linhas.[/b:3bfe467ed7]


Você diz que ´o problema é que está em Excel´, mas isto não é um problema, É A SOLUÇÃO!! Já deveria ter dito isso antes... Você fala em colocar o delimitados ´|´ manualmente em todas as 30 mil linhas do TXT!!! Tá maluco... Você está dando voltas sem sentido....

A SOLUÇÃO: esqueça o TXT, vá no excel, salve como CSV, que salvará o arquivo com o delimitador ´;´ entre os campos. Use o código já exemplificado para este delimitador... E pronto!!!!! 30 mil registros importados com sucesso total!

Só isso... mais nada....


GOSTEI 0
Microbios

Microbios

05/05/2005

vagner.deoliveira;

Tente Utilizar O ADO para abrir a planilha Excel... e diretamente copiar para seu banco de Dados, já fiz assim com um exemplo e funciona legal!
Procure aqui no fórum, vc deverá encontrar exemplos de como utilizar o Excel com ADO e no Clube Delphi tem uma matéria, (não lembro onde!) ensinando direitinho....

microbios


GOSTEI 0
Clenio

Clenio

05/05/2005

Valeu,

Vou ver se consigo encontrar

Obrigado a todos.


GOSTEI 0
POSTAR