Comparar linhas .txt
Boa tarde,
Minha duvida é o seguinte, eu queria pegar um txt. que contem variaveis em cada linha, se a variavel bater com a linha debaixo entao ela coloca na mesma linha.
Para ficar mais facil de entende, tenho esse script:
procedure TConvert.Button1Click(Sender: TObject);
begin
ele pega um arquivo de texto nesse formato :
0001ORLANDO DE OLIVEIRA 1131540786
0001ROBERTO SANTOS SILVA1185645254
0002MARIA JOSÉ CUNHA 1185233469
0003JOSE MATIAS CUBA 1131540786
0003ANTONIO JOSE ALCANTA1185645254
0003PRICILA EMANUELE 1185233469
0004THAIS CRISTINA SILVA1131540786
e converte para esse formato:
COD|NOME|TELEFONE
0001|ORLANDO DE OLIVEIRA |1131540786
0001|ROBERTO SANTOS SILVA|1185645254
0002|MARIA JOSÉ CUNHA |1185233469
0003|JOSE MATIAS CUBA |1131540786
0003|ANTONIO JOSE ALCANTA|1185645254
0003|PRICILA EMANUELE |1185233469
0004|THAIS CRISTINA SILVA|1131540786
So que como da para ver, na primeiras variaveis consta uma string com 4 caracteres, que pode variar ou nao, queria saber se tem uma maneira de criar um looping que ele compara a primeira string com a string da linha debaixo para sair nesse formato
COD|NOME|TELEFONE|NOME2|TELEFONE2|NOME3|TELEFONE3|NOME4|TELEFONE4
0001|ORLANDO DE OLIVEIRA |1131540786|ROBERTO SANTOS SILVA|1185645254
0002|MARIA JOSÉ CUNHA |1185233469
0003|JOSE MATIAS CUBA |1131540786|ANTONIO JOSE ALCANTA|1185645254|PRICILA EMANUELE |1185233469
0004|THAIS CRISTINA SILVA|1131540786
Ai ele juntou todos os codigos 1, 2 etc!
Minha duvida é o seguinte, eu queria pegar um txt. que contem variaveis em cada linha, se a variavel bater com a linha debaixo entao ela coloca na mesma linha.
Para ficar mais facil de entende, tenho esse script:
procedure TConvert.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
slEntrada := TStringList.Create;
slSaida := TStringList.Create;
slEntrada.LoadFromFile (opendialog1.FileName);
slSaida.add(cod|Nome|Telefone);
for i := 0 to slEntrada.Count - 1 do
begin
slSaida.add(
Copy(slEntrada[i],1,4) + | +
Copy(slEntrada[i],5,24) + | +
Copy(slEntrada[i],25,35) );
end;
extrc:= ExtractFileName(OpenDialog1.FileName);
for I := Length(extrc) downto 1 do
begin
if extrc[i]=. then
begin
extrc:=Copy(extrc,1,i-1);
break
end;
end;
slSaida.SaveToFile( extrc +_Final.txt );
FreeAndNil( slEntrada );
FreeAndNil( slSaida );
Close;
end;
end;
ele pega um arquivo de texto nesse formato :
0001ORLANDO DE OLIVEIRA 1131540786
0001ROBERTO SANTOS SILVA1185645254
0002MARIA JOSÉ CUNHA 1185233469
0003JOSE MATIAS CUBA 1131540786
0003ANTONIO JOSE ALCANTA1185645254
0003PRICILA EMANUELE 1185233469
0004THAIS CRISTINA SILVA1131540786
e converte para esse formato:
COD|NOME|TELEFONE
0001|ORLANDO DE OLIVEIRA |1131540786
0001|ROBERTO SANTOS SILVA|1185645254
0002|MARIA JOSÉ CUNHA |1185233469
0003|JOSE MATIAS CUBA |1131540786
0003|ANTONIO JOSE ALCANTA|1185645254
0003|PRICILA EMANUELE |1185233469
0004|THAIS CRISTINA SILVA|1131540786
So que como da para ver, na primeiras variaveis consta uma string com 4 caracteres, que pode variar ou nao, queria saber se tem uma maneira de criar um looping que ele compara a primeira string com a string da linha debaixo para sair nesse formato
COD|NOME|TELEFONE|NOME2|TELEFONE2|NOME3|TELEFONE3|NOME4|TELEFONE4
0001|ORLANDO DE OLIVEIRA |1131540786|ROBERTO SANTOS SILVA|1185645254
0002|MARIA JOSÉ CUNHA |1185233469
0003|JOSE MATIAS CUBA |1131540786|ANTONIO JOSE ALCANTA|1185645254|PRICILA EMANUELE |1185233469
0004|THAIS CRISTINA SILVA|1131540786
Ai ele juntou todos os codigos 1, 2 etc!
William Calisto
Curtidas 0
Respostas
Bruno Leandro
23/07/2012
o stringlist tem um metodo que é o IndexOf, que faz pesquisa dentro dele, só nao entendi o que você precisa, o IndexOf retorna a linha do valor pesquisado
GOSTEI 0
William Calisto
23/07/2012
o stringlist tem um metodo que é o IndexOf, que faz pesquisa dentro dele, só nao entendi o que você precisa, o IndexOf retorna a linha do valor pesquisado
Boa tarde Bruno Leandro,
Muito obrigado pela ajuda que vc deu nos 2 topicos, bom eu nao sei usar a IndexOf, mais pesquisando consegui resolver, sendo que o ultimo topico que abri era para ler um txt e transforma-lo em tabulação, adaptei seu script para o que eu queria e esta funcionando ok
O Script ficou assim:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, jpeg, GIFImg;
type
TConvert = class(TForm)
Button1: TButton;
Label1: TLabel;
Button2: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Image1: TImage;
Label2: TLabel;
procedure Button2Click(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Convert: TConvert;
slEntrada,slSaida: TStringList;
extrc,sLinha :string;
i, j: Integer;
implementation
{$R *.dfm}
procedure TConvert.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
slEntrada := TStringList.Create;
slSaida := TStringList.Create;
slEntrada.LoadFromFile (opendialog1.FileName);
slSaida.Add(EmptyStr);
slSaida.add(
@|COD_MOV|AGEN|DV_AG|N_CC|DV_N_CC|CC|DV_CC||NN|TIP_COB|+
FORM_CAD|TIP_DOC||N_CADASTRO|VENCI_TIT|VL_NOMINAL_TT|AGE+
_ENC_COB|DV_AGE_ENC_COB||ESPC|ID_TT|EMISSAO|COD_JUR_MORA|+
DATA_JUROS_M|TAXA_MES|COD_DESC|DT_DESC|PERC_DESC|IOF|VL_ABT+
|ID_EMPR|COD_PROT|N_DIA_PROT|COD_BAX|--|N_DIA_BAIX|COD_MOED|+
|COD_Rem|TIP_INS_SAC|N_INS_SACAD|NOME_SACADO|END_ SACADO|BAIRRO+
_SACADO|CEP_SACADO|CIDADE_SACADO|UF_SACADO|TIPO_INSC_AVAL|N_INSC_+
SACAD|NOME_SACADO|ID_CARNE|PC_INI|QTD_PC|N_PLANO||COD_MOV|COD_DESC+
|DT_DESCO|VL_PER_CONCEDIDO||COD_MULTA||VLR_APLIC||MSG1|MSG2|MSG3|MSG4|MSG5);
j := 0;
for i := 0 to slEntrada.Count - 1 do
if Copy(slEntrada[i],14,1) = P then
j := slSaida.add(
Copy(slEntrada[i],14,1) + | +
Copy(slEntrada[i],16,2) + | +
Copy(slEntrada[i],18,4) + | +
Copy(slEntrada[i],22,1) + | +
Copy(slEntrada[i],23,9) + | +
Copy(slEntrada[i],32,1) + | +
Copy(slEntrada[i],33,9) + | +
Copy(slEntrada[i],42,1) + | +
Copy(slEntrada[i],43,1) + | +
Copy(slEntrada[i],45,13) + | +
Copy(slEntrada[i],58,1) + | +
Copy(slEntrada[i],59,1) + | +
Copy(slEntrada[i],60,1) + | +
Copy(slEntrada[i],61,1) + | +
Copy(slEntrada[i],63,15) + | +
Copy(slEntrada[i],78,8) + | +
Copy(slEntrada[i],86,15) + | +
Copy(slEntrada[i],101,4) + | +
Copy(slEntrada[i],105,1) + | +
Copy(slEntrada[i],106,1) + | +
Copy(slEntrada[i],107,2) + | +
Copy(slEntrada[i],109,1) + | +
Copy(slEntrada[i],110,8) + | +
Copy(slEntrada[i],118,1) + | +
Copy(slEntrada[i],119,8) + | +
Copy(slEntrada[i],127,15) + | +
Copy(slEntrada[i],142,1) + | +
Copy(slEntrada[i],143,8) + | +
Copy(slEntrada[i],151,15) + | +
Copy(slEntrada[i],166,15) + | +
Copy(slEntrada[i],181,15) + | +
Copy(slEntrada[i],196,1) + | +
Copy(slEntrada[i],221,1) + | +
Copy(slEntrada[i],222,2) + | +
Copy(slEntrada[i],224,1) + | +
Copy(slEntrada[i],225,1) + | +
Copy(slEntrada[i],226,2) + | +
Copy(slEntrada[i],228,2) + |
)
else
if Copy(slEntrada[i],14,1) = Q then
slSaida[j] := slSaida[j] + | +
Copy(slEntrada[i],16,2) + | +
Copy(slEntrada[i],18,1) + | +
Copy(slEntrada[i],19,15) + | +
Copy(slEntrada[i],34,40) + | +
Copy(slEntrada[i],74,40) + | +
Copy(slEntrada[i],114,15) + | +
Copy(slEntrada[i],129,8) + | +
Copy(slEntrada[i],137,15) + | +
Copy(slEntrada[i],152,2) + | +
Copy(slEntrada[i],154,1) + | +
Copy(slEntrada[i],154,15) + | +
Copy(slEntrada[i],170,1) + | +
Copy(slEntrada[i],210,3) + | +
Copy(slEntrada[i],213,3) + | +
Copy(slEntrada[i],216,3) + | +
Copy(slEntrada[i],219,3) + |
else
if Copy(slEntrada[i],14,1) = R then
slSaida[j] := slSaida[j] + | +
Copy(slEntrada[i],16,2) + | +
Copy(slEntrada[i],18,1) + | +
Copy(slEntrada[i],19,4) + | +
Copy(slEntrada[i],22,20) + | +
Copy(slEntrada[i],42,1) + | +
Copy(slEntrada[i],66,1) + | +
Copy(slEntrada[i],67,8) + | +
Copy(slEntrada[i],75,15) + | |
else
if Copy(slEntrada[i],14,1) = S then
if Copy(slEntrada[i],21,1) <> 4 then
begin
slSaida[j] := slSaida[j] + +
Trim(Copy(slEntrada[i],19,200)) + | ;
end
else
begin
slSaida[j] := slSaida[j] + +
Trim(Copy(slEntrada[i],22,200)) + | ;
end;
if slSaida[0] = EmptyStr then
slSaida.Delete(0);
extrc:= ExtractFileName(OpenDialog1.FileName);
for I := Length(extrc) downto 1 do
begin
if extrc[i]=. then
begin
extrc:=Copy(extrc,1,i-1);
break
end;
end;
slSaida.SaveToFile( extrc +_Final.txt );
FreeAndNil( slEntrada );
FreeAndNil( slSaida );
Close;
end;
end;
procedure TConvert.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TConvert.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
sc_DragMove = $f012;
begin
ReleaseCapture;
Perform(wm_SysCommand, sc_DragMove, 0);
end;
end.
Muito Obrigado Bruno!!!
GOSTEI 0
Bruno Leandro
23/07/2012
disponha, fico feliz por poder ter ajudar, e muito obrigado por compartilhar a sua solução enriquecendo a comunidade.
GOSTEI 0