Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido)Localizar e Substituir linha


João Paulo Taraciuk

Pergunta

Boa noite

Estou procurando uma forma de localizar determinada linha de texto em arquivo texto e trocar a ordem das linhas, seria algo mais ou menos assim:

00011 1212121233330000N

00011 1213121233330000N

00011 1213121233330017N

O que está em negrito por primeiro na linha seria o número do documento, e o que está no final da linha seria o que eu tenho que alterar, fazer o seguinte, como na segunda e na terceira linha, eu preciso jogar o valor diferente de 0000 por primeiro, mas isso no meio de um arquivo que pode ter até 2000 linhas ou mais.

Seria assim, encontrar o número do documento, e o que for de mesmo número, ou seja, referente ao mesmo documento, e tiver dois valores diferentes no final da linha, eu tenho que fazer a troca, colocar o valor maior acima do menor no txt.

Eu tentei ir jogando para um ClientDataSet, mas acabou não saindo como eu esperava, se alguém tiver uma dica de como eu poderia fazer isso, eu agradeço.

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

... não entendi nada...

Pode colocar um trecho real do arquivo (umas dez linhas)?

Cola dez linhas e depois coloca essas linhas do jeito que terá que ficar...

Isso que você digitou parece arquivo de Sintegra...

Ok?

Link para o comentário
Compartilhar em outros sites

  • 0
Estou procurando uma forma de localizar determinada linha de texto em arquivo texto e trocar a ordem das linhas, seria algo mais ou menos assim:

00011 1212121233330000N

00011 1213121233330000N

00011 1213121233330017N

Acho que voce está querendo é ordenar texto... seria isto ?

É simples... jogue este arquivo texto em um memo ou voce tamvem pode fazer uma rotina para ler este arquivo texto e jogá-lo em um array.

Depois é só ordená-lo alfabeticamente

exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  texto: array[0..4] of string; // nº de linhas do seu texto
  i: Integer;
  valor: string;
  indice: Integer;
  ok: Boolean;
begin
  // exibe na ordem original
  for i := Low(texto) to High(texto) do
    texto[i] := Memo1.Lines.Strings[i];

  // faz a ordenação
  repeat
    ok := False;
    indice := 0;
    repeat
      if CompareStr(texto[indice], texto[indice + 1]) > 0 then
      begin
        valor := texto[indice];
        texto[indice] := texto[indice + 1];
        texto[indice + 1] := valor;
        ok := True;
      end;
      Inc(indice);
    until(indice > High(texto));
  until(ok = False);
  // fim ordenação

  Memo2.Clear;
  // exibe o array ordenado
  for i := Low(texto) to High(texto) do
    Memo2.Lines.Add(texto[i]);
end;

seria algo assim

Ler arquivo texto

00011 1216121233330020N

00011 1214121233330005N

00011 1212121233330000N

00011 1213121233330017N

00011 1213121233330000N

Texto ordenado

00011 1212121233330000N

00011 1213121233330000N

00011 1213121233330017N

00011 1214121233330005N

00011 1216121233330020N

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

O Arquivo tem estrutura assim

0000835910P000000000249800000000000000000000000000000000000000000000000024980000

0000835910P000000000109200000000000000000000000000000000000000000000000010921700

0000845102P000000000080100000000008010000000000200000000000000000000000000002500

0000845405P000000001280000000000000000000000000000000000000000000000000128000000

0000855405P000000001139600000000000000000000000000000000000000000000000113960000

0000865102P000000000792000000000079200000000001980000000000000000000000000002500

0000865405P000000000220000000000000000000000000000000000000000000000000022000000

0000875102P000000000013600000000001360000000000023000000000000000000000000001700

0000875405P000000001040700000000000000000000000000000000000000000000000104070000

0000885102P000000000154000000000015400000000000262000000000000000000000000001700

Vai ter que ficar assim:

0000835910P000000000109200000000000000000000000000000000000000000000000010921700

0000835910P000000000249800000000000000000000000000000000000000000000000024980000

0000845102P000000000080100000000008010000000000200000000000000000000000000002500

0000845405P000000001280000000000000000000000000000000000000000000000000128000000

0000855405P000000001139600000000000000000000000000000000000000000000000113960000

0000865102P000000000792000000000079200000000001980000000000000000000000000002500

0000865405P000000000220000000000000000000000000000000000000000000000000022000000

0000875102P000000000013600000000001360000000000023000000000000000000000000001700

0000875405P000000001040700000000000000000000000000000000000000000000000104070000

0000885102P000000000154000000000015400000000000262000000000000000000000000001700

O que está em negrito seria o número do documento, o que eu preciso, é que, por exemplo no documento 000083, no final da linha tem na linha de cima 0000 e na linha seguinte tem 0017, e o arquivo sempre vai vir assim, levando os 4 últimos dígitos em ordem crescente, o que eu preciso é colocar o 0017 antes do 0000, apenas trocar a linha dos dois, quando for o mesmo número de documento, os outros está certo, o que teria que mudr seria somente este, repare que no 0084 o 0025 no final da linha vem antes do 0000, eu estou tentando fazer algo como:

var
txt: TStrings;
a,c, linha, str1, str2: String;
b :TextFile;
begin
 AssignFile(b, 'C:3IC0131.TXT');
 Reset(b);
txt := TStringList.Create;
txt.LoadFromFile('C:3IC0131.TXT');
a:=txt[StrToInt(Edit1.Text)-1];
c:=txt[StrToInt(Edit1.Text)];
while not  Eof(b)do
begin
str1:=txt.Strings[strtoint(Edit1.Text)-1];
str2:=txt.Strings[strtoint(Edit1.Text)];
            if(Pos(a, linha))=1 then
            begin
            Delete(a, 1, 126);
            Insert(str2, a, 1);
            txt.Text:=StringReplace(txt.Text, linha, a, [rfReplaceAll]);
            Readln(b, linha);
            end;
              if(Pos(c, linha))=1 then
              begin
              Delete(c, 1, 126);
              Insert(str1, c, 1);
              txt.Text:=StringReplace(txt.Text, linha, c, [rfReplaceAll]);
              Readln(b, linha);
              end;
     Readln(b, linha);
 end;
 CloseFile(b);
 txt.SaveToFile('C:3IC0131.TXT');

No caso eu estou colocando o número da primeira linha no edit1.text manualmente, mas mesmo assim, ele coloca o mesmo valor nas duas linhas, onde eu posso mexer nesse código para que ele simplesmente troque, coloque a linha de baixo antes da de cima?

Depois eu vou tentar pegar o número da linha de um ClientDataSet, ao invés de digitar no Edit.

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

  • 0

procedure TForm1.Button1Click(Sender: TObject);
var
  texto: array[0..10] of string; // nº de linhas do seu texto
  i: Integer;
  valor: string;
  indice: Integer;
  ok: Boolean;
begin
  // exibe na ordem original
  for i := Low(texto) to High(texto) do
    texto[i] := Memo1.Lines.Strings[i];

  // faz a ordenação
  repeat
    ok := False;
    indice := 0;
    repeat
      if CompareStr(texto[indice], texto[indice + 1]) > 0 then
      begin
        valor := texto[indice];
        texto[indice] := texto[indice + 1];
        texto[indice + 1] := valor;
        ok := True;
      end;
      Inc(indice);
    until(indice > High(texto));
  until(ok = False);
  // fim ordenação

  Memo2.Clear;
  // exibe o array ordenado
  for i := Low(texto) to High(texto) do
    Memo2.Lines.Append(texto[i]); // fazer esta mudança
end;

Saida do codigo que te passei

0000835910P000000000109200000000000000000000000000000000000000000000000010921700

0000835910P000000000249800000000000000000000000000000000000000000000000024980000

0000845102P000000000080100000000008010000000000200000000000000000000000000002500

0000845405P000000001280000000000000000000000000000000000000000000000000128000000

0000855405P000000001139600000000000000000000000000000000000000000000000113960000

0000865102P000000000792000000000079200000000001980000000000000000000000000002500

0000865405P000000000220000000000000000000000000000000000000000000000000022000000

0000875102P000000000013600000000001360000000000023000000000000000000000000001700

0000875405P000000001040700000000000000000000000000000000000000000000000104070000

0000885102P000000000154000000000015400000000000262000000000000000000000000001700

a maneira como voce quer

Vai ter que ficar assim:

0000835910P000000000109200000000000000000000000000000000000000000000000010921700

0000835910P000000000249800000000000000000000000000000000000000000000000024980000

0000845102P000000000080100000000008010000000000200000000000000000000000000002500

0000845405P000000001280000000000000000000000000000000000000000000000000128000000

0000855405P000000001139600000000000000000000000000000000000000000000000113960000

0000865102P000000000792000000000079200000000001980000000000000000000000000002500

0000865405P000000000220000000000000000000000000000000000000000000000000022000000

0000875102P000000000013600000000001360000000000023000000000000000000000000001700

0000875405P000000001040700000000000000000000000000000000000000000000000104070000

0000885102P000000000154000000000015400000000000262000000000000000000000000001700

Esta exatamente do jeito que esta querendo

Agora é só voce adaptar a sua maneira.

OBS: joguei os seus dados em um memo e a ordenação em outro memo

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Então...

Era mais simples dizer que trata-se de um arquivo texto tipo "Sintegra", com número da nota fiscal, CFOP, Operação, valor da nota, base de cálculo, etc.. etc... etc... até a coluna alíquota (0000, 2500, 1700)...

Exemplo...

0000835910P000000000109200000000000000000000000000000000000000000000000010921700
                                             11111122223444444444444455555555555556666666666666777777777777788888888888889999
1=Número do Documento, 000083
2=CFOP, 5910
3=Operação, P=Própria
4=Valor Total, R$ 10,92
5=Base de Cálculo do ICMS, R$ 0,00
6=Valor do ICMS, R$ 0,00
7=Valor de Isentos, R$ 0,00
8=Valor de Outros, R$ 10,92
9=Alíquota do ICMS, 17,00%

e quando há mais de um registro para a mesma nota, eles fiquem ordenados pela alíquota, isto é, se uma nota "ocupa" três linhas, devem ficar classificadas pela alíquota... por exemplo, 0000, 1700, 2500

Pronto!

Eu preferiria ordernar os dados na query de leitura da tabela do que ordenar o arquivo texto...

Neste caso, as dicas aí dos colegas são perfeitamente válidas...

Apenas tomar cuidado com a memória... pois há arquivos de Sintegra cabulosos... 126caracteres X 62mil registros, p.e., requerem 7.812.000 bytes, o que eu acho que estouraria um TStringlist ou TMemo... aí a solução seria usar uma leitura do arquivo texto (AssignFile+Reset+ReadLn), sequencial, e gravação do resultado em outro arquivo (AssignFile+ReWrite+WriteLn)...

Ok?

Link para o comentário
Compartilhar em outros sites

  • 0

É exatamente isso, o que eu quero fazer, é quando tiver mais de um produto na nota, ele vem ordenado pela alíquota, eu quero é somente colocar outro valor antes do 0000, somente mudar a isenta para uma posição abaixo.

Ocorre que o sistema que gera o sintegra não é nosso, eu preciso fazer essa alteração para importar para o sistema com o qual a gente trabalha, e, no sistema que trabalhamos, se tiver uma nota com mais de uma alíquota, e na primeira tiver 0000(isenta), dá erro na importação, por isso teria que ter o produto com alíquota diferente de 0 antes.

O que eu estou tentando fazser é o seguinte, abro o arquivo, jogo para um ClientDataSet, insiro os dados Número da nota, linha, cfop, alíquota em uma tabela do access, aí eu faço um select nessa tabela, trazendo somente os dados que contém mais de uma alíquota na nota, jogo esses dados em outro ClientDataSet, aí eu já tenho as linhas que precisam ser trocadas as posições, porém não estou conseguindo fazer isso, alterar duas linhas de uma só vez, eu tenho no ClientDataSet2 o número da linha que precisa ser alterada.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...