文件中的内容如下:列1     列2   列3
--------------------
AAAAAAAA BBBBBB 2500
AAAAAAAA BBBBBB 3000
BBBBBBBB AAAAAA 2500
BBBBBBBB AAAAAA  500
BBBBBBBB BBBBBB 2500想要得到如下結果:AAAAAAAA BBBBBB 5500
BBBBBBBB AAAAAA 3000
BBBBBBBB BBBBBB 2500就是不能用数据庫、有什魔好方法馬?

解决方案 »

  1.   

    100分也不少了,
    honkiko(honky) 写代码吧
      

  2.   

    hehe, 再加100、 誰写代码?
      

  3.   

    最简单的var
      MyList: TStringList;
      i: integer;
    begin
      MyList:=TStringList.Create;
      MyList.LoadFromFile('c:\MyFile.txt');
      MyList.Sort;
      for i:=MyList.Count-1 downto 1 do
        if MyList[i]=MyList[i-1] then MyList.Delete(i);
      MyList.SaveToFile('c:\MyFile1.txt');
      MyList.Free;
    end;file 处理下
    数字放前面
    2500 AAAAAAAA BBBBBB 
    3000 AAAAAAAA BBBBBB 
    2500 BBBBBBBB AAAAAA 
     500 BBBBBBBB AAAAAA 
    2500 BBBBBBBB BBBBBB
      

  4.   

    更正一下procedure TForm1.Button1Click(Sender: TObject);
    var
      MyList: TStringList;
      i: integer;
    begin
      MyList:=TStringList.Create;
      MyList.LoadFromFile('c:\MyFile.txt');
      MyList.Sort;
      MyList.SaveToFile('c:\MyFile1.txt');
      MyList.Free;
    end;
      

  5.   

    file格式是固定的、数字放前面不太可能。 還有関鍵是要累計数字型、你不把各字段分開存放、如何作累計?
      

  6.   

    格式还有点不对,主要是没去管有几个空格了,没细看了,你试试
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyList: TStringList;
      i,j: integer;
      ResultList: TStringList;
      s: string;
      position: integer;
      r1,r2: integer;
    begin
      MyList:=TStringList.Create;
      ResultList:=TStringList.create;
      ResultList.clear;
      MyList.LoadFromFile('c:\MyFile.txt');
      MyList.Sort;
      {
      AAAAAAAA BBBBBB 2500
      AAAAAAAA BBBBBB 3000
      BBBBBBBB AAAAAA  500
      BBBBBBBB AAAAAA 2500
      BBBBBBBB BBBBBB 2500
      }
      i:=0;
      j:=0;
      s:=MyList.Strings[0];
      ResultList.Add(s);
      //showmessage(MyList.Strings[0]);
      //如果前面两列相等 +数  第二个空格为分割符号
      //如果不相等 加列
      for i:=1 to MyList.count-1 do
      begin
        s:=MyList.Strings[i];
        position:=pos(' ',s);
        s:=trimleft(copy(s,pos(' ',s),length(s)-pos(' ',s)));    position:=position+pos(' ',s);
        s:=MyList.Strings[i];
        s:=trimleft(copy(s,1,position));
        if s=copy(ResultList.Strings[j],1,position) then
        begin
          r1:=strtoint(trimleft(copy(ResultList.Strings[j],position,length(ResultList.Strings[j])-position+1)));
          r2:=strtoint(trimleft(copy(MyList.Strings[i],position,length(MyList.Strings[i])-position+1)));
          ResultList.Strings[j]:=s+' '+inttostr(r1+r2);
        end
        else
        begin
        s:=MyList.Strings[i];
        ResultList.Add(s);
        inc(j);
        end;
      end;
      ResultList.SaveToFile('c:\Result.txt');
      MyList.Free;
      ResultList.free;
    end;
      

  7.   

    ResultList.Strings[j]:=s+' '+inttostr(r1+r2);
    改为
    ResultList.Strings[j]:=s+inttostr(r1+r2);
    格式就对齐了
      

  8.   

    创建一个数据集,把数据读到数据集中,然后用sql语句读取不就行了
      

  9.   

    如果你能保证格式都这样,都是 字符串+空格+字符串+空格+数字  ,那就好写多了
    可以先取第一个字符串,将第2个空格前面切出循环来比较,如果相同,把值一加,然后删除一样的stringlist项,做一次循环旧可以写完
      

  10.   

    没用clientdataset我至今还不知道怎么对这么个东西使用sql语句。
    知道的,说说 曾经问过的帖子,呵呵
    http://community.csdn.net/Expert/topic/3400/3400970.xml?temp=1.682681E-02
      

  11.   

    用ADO直接打开文本文件,当然你的文本文件要规整,也就是用打开文本数据库的方法
      

  12.   

    以下是用ADO直接連文本文件的方法。一.要做一個名子固定的ini文件(schema.ini)、与temp1.txt(内容如題)放在同一個路径下。
    schema.ini的内容如下:
    [temp1.txt]
    ColNameHeader=false
    Format=Delimited( )
    Col1=Col1 Char Width 8
    Col2=Col2 Char Width 6
    Col3=Col3 Char Width 4//説明:此処字段長度是固定的、長度(Width)不包含隔離符号、
        隔離符号(Delimited)在此是一個空格。二.ADOQuery1的属性ConnectionString的内容:
    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\DB_Text;Extended Properties=Text;Persist Security Info=FalseADOQuery1.SQL.Text := 'SELECT col1, col2, SUM(col3) FROM temp1#txt GROUP BY col1,col2';//説明:上述Data Source是実際的文本文件所在的路径名
      

  13.   

    謝謝諸位的参与!特別要謝謝aloking(黑鲸)、如果有興趣、按我説的方法試試看。