Ir para conteúdo
  • Cadastre-se

dev botao

Separar String Que Contém Pipe


  • Este tópico foi criado há 3465 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Eu tenho linha com a seguinte descrição '|0200|4|SALGADOS|||KG|00|19051000||||17|'. Preciso separar os dados do pipe para salvar no banco. Alguma sujestão?

ReadLn(txt, line);
if True then
  if (Pos('|0200|', line)) = 1 then
  begin
    fArq.Add(line);
    //fdquery....
  end;
  if (pos('|0000|', line)) = 1 then
  begin
    //fdquery....
    fArq.Add(line);
  end;
  if (pos('|0005|', line)) = 1 then
  begin
    //fdquery....
    fArq.Add(line);
  end;
  if (pos('|C460|', line)) = 1 then
  begin
    //fdquery....
    fArq.Add(line);
    flagCF := True;
  end
  else
  begin
    if flagCF = True then
      if (pos('|C490|', line)) = 0 then
        //fdquery....
        fArq.Add(line)
      else
        flagCF := False;
  end
Link para o comentário
Compartilhar em outros sites

 

TBloco0=record

   campo1:integer;
   campo2:string;
   ....
   campon:real;
   end;
 
private
registrosBloco0:Array of TBloco0;
registrosBlocoC100:Array of TBloco0;
...
 
procedure minhafuncao;
const
separador:string='|;
var
i:integer;
posicao:integer;
registroUnicoBloco0:TBloco0;
begin
while...
   ....
 
if (Pos('|0000|', line)) = 1 then
 begin
  fArq.Add(line);
 
 
posicao:=0; //ou coloca-1 e ignora a linha abaixo
line := Copy(line,2,Length(line)-1); //dispensa o primeiro Pipe (ou faz isso ou coloca -1 na posição)...
for i:=1 to Length(line) do
   begin
   if (line = separador) then
      inc(posicao)    
   else if (posicao=0) then
      registroUnicoBloco0.campo1 := strtoint(inttostr(registroUnicoBloco0.campo1)+line)
   else if (posicao=1) then
      registroUnicoBloco0.campo2 := registroUnicoBloco0.campo2+line)
   ....
   end;
SetLength(registroBloco0, Length(registroBloco0) +1);
registroBloco0[registroBloco0)-1] := registroUnicoBloco0;
  //fdquery....
  end;

 

 

Tá longe de ser a forma mais bonita, mas fiz assim quando precisei de algo parecido e funcionou,

além de eu particularmente achar que fica mais fácil de dar manutenção quando é adicionado um novo campo por exemplo...

 

Outra forma seria usar as próprias classes e listas do ACBR para SPED, mas se o Layout for diferente do padrão já complica um pouco...

Marcos Gerene

[email protected]

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Se a ideia é somente ler os dados da linha, você pode usar o TStringList em qualquer versão do delphi, versões a partir do XE tem métodos prontos na unit StrUtils.

 

Exemplo do TStringList:

var
  StrList: TStringList;
begin
  StrList := TStringList.Create;
  try
    // alimentar a lista com a string
    StrList.Delimiter := '|';
    StrList.StrictDelimiter := True;
    StrList.DelimitedText := <Seu texto com delimitadores>;

    // leitura
    varivale1 := StrList[0];
    varivale2 := StrList[1];
    varivale3 := StrList[2];
    varivale4 := StrList[3];
    varivale5 := StrList[4];
  finally
    StrList.Free;
  end;
end;

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

Eu uso a função abaixo em algumas situações.

function ExtrairRegistro(pTexto: string; pPosicao: integer; pCaracter: String = '|'): String;
var
  i: integer;
  sRestanteDoTexto: string;
begin
  Result:= '';
  i:= 0;
  sRestanteDoTexto:= pTexto;


  while (i <= pPosicao) do begin


    if i = pPosicao then begin
      Result:= Copy(sRestanteDoTexto, 1, pos(pCaracter,sRestanteDoTexto)-1);
      Exit;
    end;


    sRestanteDoTexto:= copy(sRestanteDoTexto, pos(pCaracter, sRestanteDoTexto) + 1, Length(sRestanteDoTexto)  );
    inc(i);


    if not(AnsiContainsText(sRestanteDoTexto, pCaracter)) then begin
      Exit;
    end;
  end;
end;
ExtrairRegistro('|Teste|abc|1234|',2); // ---> Resultado "abc"

Quem sabe ajude!  :smile:  

Saudações,
Luiz Paulo Ferrari

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3465 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.