VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3302|回复: 27

文本删除重复算法问题~~高手请指点下

[复制链接]

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-1-31 19:00:01 | 显示全部楼层 |阅读模式
文本文档内容如下

// s1   s2 s3     s4      s5
20161217,D,B,DKDDA332021,ESA3332SS1
20161217,D,B,DKDDA332022,ESA3332SS2
20161217,D,B,DKDDA332023,ESA3332SS3
20161217,D,B,DKDDA332021,ESA3332SS2
20161217,D,B,DKDDA332025,ESA3332SS2
20161217,D,B,DKDDA332021,ESA3332SS3
20161217,D,B,DKDDA332022,ESA3332SS7

其中在文本文档中,s4和s5 会有重复的数据.我想把重复的全部删除了.
但是用SORT排序,只能对整行排序.能不能按照s4和s4来进行排序,并删除其中的重复能容(整行)!谢谢大家
凡S4有相同的,只留一行,其余行删去;凡S5有相同的,只留一行
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-10 20:15:01 | 显示全部楼层
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
newlist,s4list,filelist:tstringlist;
liushui,dates,barcode,company,inout:string;
i:integer;
s4:string;
off,d1,d2,d3,d4:integer;
begin
opendialog1.Execute;
filelist:=TStringList.create;
filelist.loadfromfile(opendialog1.FileName);
newlist:=TStringList.Create;
s4list:=TStringList.Create;
s4list.sorted:=True; //排序,将加快搜索速度

for i:=0 to filelist.count -1  do
begin
  off:=posEx(',',filelist[i],0);
d1:=off;
dates:=copy(filelist[i],0,d1-1);
off:=posEx(',',filelist[i],off+1);
d2:=off;
company:=copy(filelist[i],d1+1,d2-d1-1);
off:=posEx(',',filelist[i],off+1);
d3:=off;
inout:=copy(filelist[i],d2+1,d3-d2-1);
off:=posEx(',',filelist[i],off+1);
d4:=off;
barcode:=copy(filelist[i],d3+1,d4-d3-1);
off:=posEx(',',filelist[i],off+1);
liushui:= copy(filelist[i],d4+1,100);
s4:=barcode; //s4
  if newlist.indexof(s4)>0 then
begin
  newlist.add(filelist[i]);
  s4list.add(s4);
end;
end;

newlist.savetofile(opendialog1.FileName)
end;

end.

刚才测试并没通过~~S4重复的还存在
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-23 21:00:02 | 显示全部楼层
procedure TForm1.Button1Click(Sender: TObject);
var
  SL : TStringList;
  I,K: Integer;
  str: string;
begin
  SL := TStringList.Create;
  { 原文本位于程序目录下的b.txt }
  SL.LoadFromFile(sysutils.ExtractFilePath(application.ExeName)+'b.txt');
  {以下是把S4相同的删除余一行}
  for I := SL.Count-1 downto 0 do
      begin
      Str := SL[I];
      for K := 1 to 3 do
          Str := Copy(Str,pos(',',Str)+1,MAXINT);
      Str := Copy(Str,1,Pos(',',Str)-1);
      SL[I] := Str + ',' + SL[I];
      end;
  SL.Sort;
  str := Copy(SL[SL.count-1],1,pos(',',SL[SL.count-1])-1);
  SL[SL.count-1] := Copy(SL[SL.count-1],pos(',',SL[SL.count-1])+1,MAXINT);
  for I := SL.Count-2 downto 0 do
      begin
      if Copy(SL[I],1,pos(',',SL[I])-1) = Str then
         SL.Delete(I)
         else
         begin
         str := Copy(SL[I],1,pos(',',SL[I])-1);
         SL[I] := Copy(SL[I],pos(',',SL[I])+1,MAXINT);
         end;
      end;
  {以下是把S5相同的删除余一行}
  for I := SL.Count-1 downto 0 do
      begin
      Str := SL[I];
      for K := 1 to 4 do
          Str := Copy(Str,pos(',',Str)+1,MAXINT);
      SL[I] := Str + ',' + SL[I];
      end;
  SL.Sort;
  str := Copy(SL[SL.count-1],1,pos(',',SL[SL.count-1])-1);
  SL[SL.count-1] := Copy(SL[SL.count-1],pos(',',SL[SL.count-1])+1,MAXINT);
  for I := SL.Count-2 downto 0 do
      begin
      if Copy(SL[I],1,pos(',',SL[I])-1) = Str then
         SL.Delete(I)
         else
         begin
         str := Copy(SL[I],1,pos(',',SL[I])-1);
         SL[I] := Copy(SL[I],pos(',',SL[I])+1,MAXINT);
         end;
      end;
  {全部整理完毕,结果存在程序目录下的 bb.txt }
  SL.SaveToFile(sysutils.ExtractFilePath(application.ExeName)+'bb.txt');
  SL.Free;
end;
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-23 21:30:01 | 显示全部楼层
呵呵,测试一下,如果不行,再回贴
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-25 17:15:01 | 显示全部楼层
你试一下吧,我的代码没问题的
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-26 13:15:02 | 显示全部楼层
20161217,D,B,DKDDA332021,ESA3332SS1
20161217,D,B,DKDDA332022,ESA3332SS2
20161217,D,B,DKDDA332023,ESA3332SS3
20161217,D,B,DKDDA332021,ESA3332SS2
20161217,D,B,DKDDA332025,ESA3332SS2
20161217,D,B,DKDDA332021,ESA3332SS3
20161217,D,B,DKDDA332022,ESA3332SS7


DKDDA332021
怎么会被删除了~~很奇怪哦,你帮我看看吧
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-26 19:00:02 | 显示全部楼层
因为第一、四、六行S4里都有它啊,师傅
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-27 11:15:01 | 显示全部楼层
哦,重复的给我留一行吧~~
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-27 13:45:01 | 显示全部楼层
哦,这还真是个问题哈哈,我给看一下哈
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-27 15:00:01 | 显示全部楼层
哈哈,是啊,我表达的不够清楚,不好意思哦~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表