文件排序思路

才子鸣 2015-10-16 10:39:32
一个文本文件,里面内容为
张三,男,25,18606299999
李四,女,21,13888888888
后面是很多这样的内容

怎么实现把这些内容读出来,然后用手机号码排序后再输出!!?
...全文
483 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobzhai 2015-11-27
  • 打赏
  • 举报
回复
测试下插入源代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo2.Lines := SortMyStringlist(memo1.Lines, 3);
end;
weixin_32666569 2015-11-22
  • 打赏
  • 举报
回复
引用 7 楼 bobzhai的回复:
写了个函数,实际使用获得通过:

{n为最后一列的字符个数}
function SortMyStringlist(MyStrings: TStrings; n: integer): TStringList;
var
i, m: integer;
Myslist: TStringList;
sw: widestring;
begin
MySlist := Tstringlist.Create;
MySlist.Text := MyStrings.Text;

{将最后一列加到第一列前面}
m := Myslist.Count; //行数
for i := 0 to m - 1 do
begin
myslist[i] := rightstr(myslist[i], n) + myslist[i];
end;
myslist.Sort; //排序

{再把加上去的n个字符去掉}
for i := 0 to m - 1 do
begin
sw:=myslist[i]; //用widestring类型,保证汉字与英文数字混合时字符串处理准确
myslist[i] := rightstr(sw, length(sw)-n);
end;

result := myslist;
end;


{调用}
procedure TForm1.Button1Click(Sender: TObject);
begin
memo2.Lines := SortMyStringlist(memo1.Lines, 3);
end;

bobzhai 2015-11-17
  • 打赏
  • 举报
回复
用中文逗号:
bobzhai 2015-11-17
  • 打赏
  • 举报
回复
这里面没有牵涉到分隔符,也就是无所谓分隔符是什么: 1、将最后一列取到前面,myslist[i] := rightstr(myslist[i], n) + myslist[i]; 没有涉及到分隔符; 2、将最前面多出来的去掉,myslist[i] := rightstr(sw, length(sw)-n);,也没有涉及到分隔符
lyhoo163 2015-11-17
  • 打赏
  • 举报
回复
楼上好象不支持中文“,”分隔符。
bobzhai 2015-11-17
  • 打赏
  • 举报
回复
写了个函数,实际使用获得通过:

{n为最后一列的字符个数}
function SortMyStringlist(MyStrings: TStrings; n: integer): TStringList;
var
i, m: integer;
Myslist: TStringList;
sw: widestring;
begin
MySlist := Tstringlist.Create;
MySlist.Text := MyStrings.Text;

{将最后一列加到第一列前面}
m := Myslist.Count; //行数
for i := 0 to m - 1 do
begin
myslist[i] := rightstr(myslist[i], n) + myslist[i];
end;
myslist.Sort; //排序

{再把加上去的n个字符去掉}
for i := 0 to m - 1 do
begin
sw:=myslist[i]; //用widestring类型,保证汉字与英文数字混合时字符串处理准确
myslist[i] := rightstr(sw, length(sw)-n);
end;

result := myslist;
end;


{调用}
procedure TForm1.Button1Click(Sender: TObject);
begin
memo2.Lines := SortMyStringlist(memo1.Lines, 3);
end;

weixin_32666569 2015-11-14
  • 打赏
  • 举报
回复
引用 2 楼 lyhoo163的回复:
D:\1.txt
张三1,男,25,18606299991
李四2,女,21,13888888882
张三3,男,25,18606299993
李四4,女,21,13888888884
张三5,男,25,18606299995
李四6,女,21,13888888886
张三7,男,25,18606299997
李四8,女,21,13888888888
张三9,男,25,18606299999
李四11,女,21,13888888810
张三22,男,25,18606299911
李四33,女,21,13888888812
张三44,男,25,18606299913
李四55,女,21,13888888814
张三66,男,25,18606299915
李四77,女,21,13888888816
张三88,男,25,18606299917
李四99,女,21,13888888818
张三98,男,25,18606299919
李四76,女,21,13888888828
张三54,男,25,18606299929
李四32,女,21,13888888838
处理代码:
procedure TForm1.Button5Click(Sender: TObject);
var List1,List2: TStringList;
    FileName:string;
    i,j,k :integer;
    A : array of array[0..3] of String;
    S:string;
begin
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  FileName:='D:\1.txt';
  List1.LoadFromFile(FileName);
  SetLength(A, List1.Count);
  for i:=0 to List1.Count-1 do
  begin
    List2.Clear;
    List2.Delimiter := ',';
    List2.DelimitedText :=List1.Strings[i];
    for j:=0 to List2.Count-1 do
      A[i,j]:=List2.Strings[j];
  end;
// 排序
  for i:=0 to List1.Count-2 do
    for j:=I+1 to List1.Count-1 do
      if A[i,3]>A[j,3] then
        for k:=0 to List2.Count-1 do
        begin
          S:=A[i,k];
          A[i,k]:=A[j,k];
          A[j,k]:=S;
        end;
  List2.Clear;
  for i:=0 to List1.Count-1 do
  begin
    S:='';
    for j:=0 to 3 do
      S:=S+A[i,j]+',';
    S:=Copy(s,1,Length(S)-1);
    List2.Add(S);
  end;
  FileName:='D:\2.txt';
  List2.SaveToFile(FileName);
  List1.Free;
  List2.Free;
end;
处理后 后输出 D:\2.txt:
李四11,女,21,13888888810
李四33,女,21,13888888812
李四55,女,21,13888888814
李四77,女,21,13888888816
李四99,女,21,13888888818
李四76,女,21,13888888828
李四32,女,21,13888888838
李四2,女,21,13888888882
李四4,女,21,13888888884
李四6,女,21,13888888886
李四8,女,21,13888888888
张三22,男,25,18606299911
张三44,男,25,18606299913
张三66,男,25,18606299915
张三88,男,25,18606299917
张三98,男,25,18606299919
张三54,男,25,18606299929
张三1,男,25,18606299991
张三3,男,25,18606299993
张三5,男,25,18606299995
张三7,男,25,18606299997
张三9,男,25,18606299999
这个代码好,用了两个TStringlist处理,一个读取文本的每一行,一个处理一行中的每段
weixin_32666569 2015-11-14
  • 打赏
  • 举报
回复
用Tstringlist,有排序功能,需要先把电话处理到第一列
lyhoo163 2015-11-14
  • 打赏
  • 举报
回复
楼主无反应?是因为前面代码不支持汉字分隔符,现贴出支持汉字分隔开的代码。
procedure TForm1.Button5Click(Sender: TObject);
var MyList:TStringList;
    FileName:string;
    S,S1,S2,S3,SS1,SS2,SS3,SS4:WideString;
    Top,i,j,k:Integer;
    A : array of array [0..3] of String;
begin
  FileName:='D:\A.txt';
  MyList:=TStringList.Create;
  MyList.LoadFromFile(FileName);
  Top:=MyList.Count;
  SetLength (A, Top);                             // 设置动态数组长度
  for i:=0 to Top-1 do
  begin
    S:=MyList.Strings[i];
    k:=Pos(',',S);
    A[i,0]:=Copy(S,1,K-1);
    S:=Copy(S,K+1,Length(S)-k);
    k:=Pos(',',S);
    A[i,1]:=Copy(S,1,K-1);
    S:=Copy(S,K+1,Length(S)-k);
    k:=Pos(',',S);
    A[i,2]:=Copy(S,1,K-1);
    A[i,3]:=Copy(S,K+1,Length(S)-k);
  end;
  for i:=0 to Top-2 do
    for j:=i+1 to Top-1 do
    begin
      S1:=A[i,3];
      S2:=A[j,3];
      if S1>S2 then
      begin
        SS1:=A[i,0];
        SS2:=A[i,1];
        SS3:=A[i,2];
        SS4:=A[i,3];
        A[i,0]:=A[j,0];
        A[i,1]:=A[j,1];
        A[i,2]:=A[j,2];
        A[i,3]:=A[j,3];
        A[j,0]:=SS1;
        A[j,1]:=SS2;
        A[j,2]:=SS3;
        A[j,3]:=SS4;
      end;
    end;
  MyList.Clear;
  for i:=0 to Top-1 do
    MyList.Add(A[i,0]+','+A[i,1]+','+A[i,2]+','+A[i,3]);
  MyList.SaveToFile(FileName);
  MyList.Free;
end;
上述代码,经过测试。
lyhoo163 2015-10-16
  • 打赏
  • 举报
回复
上述代码完成整理排序,你的软件中如何输出,自己再作处理吧。
lyhoo163 2015-10-16
  • 打赏
  • 举报
回复
D:\1.txt
张三1,男,25,18606299991
李四2,女,21,13888888882
张三3,男,25,18606299993
李四4,女,21,13888888884
张三5,男,25,18606299995
李四6,女,21,13888888886
张三7,男,25,18606299997
李四8,女,21,13888888888
张三9,男,25,18606299999
李四11,女,21,13888888810
张三22,男,25,18606299911
李四33,女,21,13888888812
张三44,男,25,18606299913
李四55,女,21,13888888814
张三66,男,25,18606299915
李四77,女,21,13888888816
张三88,男,25,18606299917
李四99,女,21,13888888818
张三98,男,25,18606299919
李四76,女,21,13888888828
张三54,男,25,18606299929
李四32,女,21,13888888838
处理代码:
procedure TForm1.Button5Click(Sender: TObject);
var List1,List2: TStringList;
    FileName:string;
    i,j,k :integer;
    A : array of array[0..3] of String;
    S:string;
begin
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  FileName:='D:\1.txt';
  List1.LoadFromFile(FileName);
  SetLength(A, List1.Count);
  for i:=0 to List1.Count-1 do
  begin
    List2.Clear;
    List2.Delimiter := ',';
    List2.DelimitedText :=List1.Strings[i];
    for j:=0 to List2.Count-1 do
      A[i,j]:=List2.Strings[j];
  end;
// 排序
  for i:=0 to List1.Count-2 do
    for j:=I+1 to List1.Count-1 do
      if A[i,3]>A[j,3] then
        for k:=0 to List2.Count-1 do
        begin
          S:=A[i,k];
          A[i,k]:=A[j,k];
          A[j,k]:=S;
        end;
  List2.Clear;
  for i:=0 to List1.Count-1 do
  begin
    S:='';
    for j:=0 to 3 do
      S:=S+A[i,j]+',';
    S:=Copy(s,1,Length(S)-1);
    List2.Add(S);
  end;
  FileName:='D:\2.txt';
  List2.SaveToFile(FileName);
  List1.Free;
  List2.Free;
end;
处理后 后输出 D:\2.txt:
李四11,女,21,13888888810
李四33,女,21,13888888812
李四55,女,21,13888888814
李四77,女,21,13888888816
李四99,女,21,13888888818
李四76,女,21,13888888828
李四32,女,21,13888888838
李四2,女,21,13888888882
李四4,女,21,13888888884
李四6,女,21,13888888886
李四8,女,21,13888888888
张三22,男,25,18606299911
张三44,男,25,18606299913
张三66,男,25,18606299915
张三88,男,25,18606299917
张三98,男,25,18606299919
张三54,男,25,18606299929
张三1,男,25,18606299991
张三3,男,25,18606299993
张三5,男,25,18606299995
张三7,男,25,18606299997
张三9,男,25,18606299999
doloopcn 2015-10-16
  • 打赏
  • 举报
回复
用ADO操作文本文件,然后用SQL语句Select * From 你的文本文件名(包含后缀名,如:a.txt) ORDER BY 4
文本文件 第一行最好有字段名
用jet 引擎就可以了,连接字串如下:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Users\SerAdmin\Documents\;
Extended Properties=TEXT;
Password="";
User ID=Admin;
Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=96;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
。其实就只有前三行是最重要的,

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧