Importar TXT com virgula
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
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
Curtidas 0
Respostas
Vagner.oliveira
05/05/2005
sobe
GOSTEI 0
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]
é 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
05/05/2005
Ideia...
É 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
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
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.
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
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
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
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
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.
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
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.
Se for isso é fácil... basta usar o Copy com números fixos de posição inicial e quantidade.
GOSTEI 0
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
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
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
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
=====
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
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 .
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
05/05/2005
o que eu falei antes
continua válido
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
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
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
=====
dividir em colunas e adicionar um separador escolhido. Vê se isso é
verdade.
AntSer
=====
GOSTEI 0
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
====
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
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
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
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
05/05/2005
Valeu,
Vou ver se consigo encontrar
Obrigado a todos.
Vou ver se consigo encontrar
Obrigado a todos.
GOSTEI 0