importar arquivo de texto
pessoal possuo um arquivo de texto para importar para firebird, onde meu campo chama valor do tipo numeric(18,2), abaixo exemplo de 3 linhas para importar.
linha 1 -> 0000093800
linha 2 -> 0000001100
linha 3 -> 0000134550
neste arquivo de texto possuo apenas valores que não passam de 9 mil reais, o layout é o seguinte começando do final do arquivo e contando 6 posições tenho o preço do produto
linha 1 R$ 938,00
linha 2 R$ 11,00
linha 3 R$1.345,50
estou importando da seguinte forma
...
Query.parambyname(`preco`).ascurrency := strtocurr(copy(linha,5,6));
...
porem o valor esta ficando errado no meu banco de dados, exemplo os R$ 11,00 esta ficando assim R$ 1.100,00, alguém sabe como formatar correto esta importação do caso de valores ?
linha 1 -> 0000093800
linha 2 -> 0000001100
linha 3 -> 0000134550
neste arquivo de texto possuo apenas valores que não passam de 9 mil reais, o layout é o seguinte começando do final do arquivo e contando 6 posições tenho o preço do produto
linha 1 R$ 938,00
linha 2 R$ 11,00
linha 3 R$1.345,50
estou importando da seguinte forma
...
Query.parambyname(`preco`).ascurrency := strtocurr(copy(linha,5,6));
...
porem o valor esta ficando errado no meu banco de dados, exemplo os R$ 11,00 esta ficando assim R$ 1.100,00, alguém sabe como formatar correto esta importação do caso de valores ?
Andre Ucella
Curtidas 0
Respostas
Wilson Brito
08/11/2013
Query.parambyname(`preco`).ascurrency := strtocurr(copy(linha,5,4) + ',' + copy(linha,9,2));
GOSTEI 0
Samuel Santos
08/11/2013
Levando em conta que seu arquivo seja de tamanho FIXO E A PRIMEIRA LINHA SEJA CABEÇALHO e tenha 3 campos separados por espaço:
Codigo 6 posiçõs INTEIRO
Salario 30 posições STRING
Salario 12 posições VALOR/FLOAT/DOUBLE... ETC.
OBS.: o CAMPO Salario está sem formatação
Codigo Nome-------------------------- -----Salario
000234 SAMUEL DOS SANTOS 000000099900
000456 JOAO DA SILVA JUNIOR 000000012340
000678 MARIA DA PENHA 000000045600
Segue o Código que já foi testado, ATENÇÃO fiz a definição do DataSet local "cdsRecebeTXT: TClientDataSet", Caso você coloque o componente no formulário retire a definição e também a criação "cdsRecebeTXT := TClientDataSet.Create(Self);".
Defina o DataSet ou tabela e modifique o código conforme sua necessidade
procedure TForm1.Button1Click(Sender: TObject);
var
FileIn :TextFile;
S_Linha, sArqImporta :String;
Code :Integer;
sCodigo, sNome, sCampox: String;
dValor :Double;
cdsRecebeTXT:TClientdataSet;
begin
//Criação do Dataset (ATENÇÃO fiz a definição do DataSet local "cdsRecebeTXT: TClientDataSet"
//Caso você coloque o componente no formulário retire a definição e também a
// criação: ABAIXO "cdsRecebeTXT := TClientDataSet.Create(Self);"
cdsRecebeTXT := TClientDataSet.Create(Self);
cdsRecebeTXT.FieldDefs.Clear;
cdsRecebeTXT.FieldDefs.Add('CODIGO', ftInteger, 0, false);
cdsRecebeTXT.FieldDefs.Add('NOME', ftString, 30, false);
cdsRecebeTXT.FieldDefs.Add('SALARIO', ftFloat, 0, false);
cdsRecebeTXT.CreateDataSet;
cdsRecebeTXT.Open;
//Nome do arquivo a ser inportado: Alimente esta variável com local e nome do arquivo
sArqImporta := 'C:\LIXO\ArquivoTexto.txt';
//Associação ao TextFile
AssignFile (FileIn, sArqImporta);
//Abrindo o arquivo texto
Reset (FileIn);
// efetua leitura do registro(Linha) e posiciona no segundo.
// NO MEU CASO TENHO CABEÇALHO QUE NÃO INTERESSA, NO PROCESSO.
Readln (FileIn, S_Linha);
// FAZ o Loop até fim de arquivo
while not Eof (FileIn) do
begin
//Efetua a leitura da linha e posiciona na próxima
Readln (FileIn, S_Linha);
//Meu registro já está em S_LINHA, vou alimentar as variáveis:
sCodigo := Copy(S_Linha, 1, 6);
sNome := Copy(S_Linha, 8, 30);
sCampox := Copy(S_Linha, 39, 12);
Val(sCampox, dValor, Code);
dValor := dValor/100;
// gravação do dataset
cdsRecebeTXT.Append;
cdsRecebeTXT.FieldByName('CODIGO').AsInteger := StrToInt(sCodigo);
cdsRecebeTXT.FieldByName('NOME').AsString := sNome;
cdsRecebeTXT.FieldByName('SALARIO').AsFloat := dValor;
cdsRecebeTXT.Post;
end;
CloseFile (FileIn);
end;
SSS
Codigo 6 posiçõs INTEIRO
Salario 30 posições STRING
Salario 12 posições VALOR/FLOAT/DOUBLE... ETC.
OBS.: o CAMPO Salario está sem formatação
Codigo Nome-------------------------- -----Salario
000234 SAMUEL DOS SANTOS 000000099900
000456 JOAO DA SILVA JUNIOR 000000012340
000678 MARIA DA PENHA 000000045600
Segue o Código que já foi testado, ATENÇÃO fiz a definição do DataSet local "cdsRecebeTXT: TClientDataSet", Caso você coloque o componente no formulário retire a definição e também a criação "cdsRecebeTXT := TClientDataSet.Create(Self);".
Defina o DataSet ou tabela e modifique o código conforme sua necessidade
procedure TForm1.Button1Click(Sender: TObject);
var
FileIn :TextFile;
S_Linha, sArqImporta :String;
Code :Integer;
sCodigo, sNome, sCampox: String;
dValor :Double;
cdsRecebeTXT:TClientdataSet;
begin
//Criação do Dataset (ATENÇÃO fiz a definição do DataSet local "cdsRecebeTXT: TClientDataSet"
//Caso você coloque o componente no formulário retire a definição e também a
// criação: ABAIXO "cdsRecebeTXT := TClientDataSet.Create(Self);"
cdsRecebeTXT := TClientDataSet.Create(Self);
cdsRecebeTXT.FieldDefs.Clear;
cdsRecebeTXT.FieldDefs.Add('CODIGO', ftInteger, 0, false);
cdsRecebeTXT.FieldDefs.Add('NOME', ftString, 30, false);
cdsRecebeTXT.FieldDefs.Add('SALARIO', ftFloat, 0, false);
cdsRecebeTXT.CreateDataSet;
cdsRecebeTXT.Open;
//Nome do arquivo a ser inportado: Alimente esta variável com local e nome do arquivo
sArqImporta := 'C:\LIXO\ArquivoTexto.txt';
//Associação ao TextFile
AssignFile (FileIn, sArqImporta);
//Abrindo o arquivo texto
Reset (FileIn);
// efetua leitura do registro(Linha) e posiciona no segundo.
// NO MEU CASO TENHO CABEÇALHO QUE NÃO INTERESSA, NO PROCESSO.
Readln (FileIn, S_Linha);
// FAZ o Loop até fim de arquivo
while not Eof (FileIn) do
begin
//Efetua a leitura da linha e posiciona na próxima
Readln (FileIn, S_Linha);
//Meu registro já está em S_LINHA, vou alimentar as variáveis:
sCodigo := Copy(S_Linha, 1, 6);
sNome := Copy(S_Linha, 8, 30);
sCampox := Copy(S_Linha, 39, 12);
Val(sCampox, dValor, Code);
dValor := dValor/100;
// gravação do dataset
cdsRecebeTXT.Append;
cdsRecebeTXT.FieldByName('CODIGO').AsInteger := StrToInt(sCodigo);
cdsRecebeTXT.FieldByName('NOME').AsString := sNome;
cdsRecebeTXT.FieldByName('SALARIO').AsFloat := dValor;
cdsRecebeTXT.Post;
end;
CloseFile (FileIn);
end;
SSS
GOSTEI 0
Andre Ucella
08/11/2013
Obrigado pessoal deu certo aqui.
GOSTEI 0