PDEMLOG260#          2006-03-27 20:10:50   登出               2006-03-27 20:12:17   登出           sysadmin   2006-03-27 20:29:36   登录           sysadmin   2006-03-27 20:29:43   登出           sysadmin   2006-03-27 20:32:40   登录           aa   2006-03-27 20:33:01   重新登录           aa   2006-03-27 20:36:20   登出           dd   2006-03-27 20:36:41   登录           dd   2006-03-27 20:36:49   登出           ee   2006-03-27 20:41:15   登录           ee   2006-03-27 20:41:53   登出           ss   2006-03-27 20:53:05   登录           ss   2006-03-27 20:53:24   登出           gg   2006-03-28 08:40:13   登录           gg   2006-03-28 08:43:41   登出        有上面这样一个a.log文件,我现在想读取到一个Memo中,并且在“”,“”,“”,“”等这些特殊字符前面加上回车,并把相应的特殊字符替换掉,显示如下:PDEMLOG260#       
    2006-03-27 20:10:50
    登出            
    2006-03-27 20:12:17
    登出        
    sysadmin
    2006-03-27 20:29:36
    登录        
    sysadmin
    2006-03-27 20:29:43
    登出        
    sysadmin
    2006-03-27 20:32:40
    登录        
    aa
    2006-03-27 20:33:01
    重新登录        
    aa
    2006-03-27 20:36:20
    登出        
    dd
    2006-03-27 20:36:41
    登录        
    dd
    2006-03-27 20:36:49
    登出        
    ee
    2006-03-27 20:41:15
    登录        
    ee
    2006-03-27 20:41:53
    登出        
    ss
    2006-03-27 20:53:05
    登录        
    ss
    2006-03-27 20:53:24
    登出        
    gg
    2006-03-28 08:40:13
    登录        
    gg
    2006-03-28 08:43:41
    登出   
  

解决方案 »

  1.   

    var
      filePath: AnsiString;
    begin
        filePath := 'E:\20060424.log';
        if(FileExists(filePath))  then
        begin
            MmLog.Lines.LoadFromFile(filePath);
            MmLog.Lines.Delimiter := '"';
            MmLog.Lines.DelimitedText := MmLog.Lines.Text;
        end;
    end;
      

  2.   

    var
      filePath: String;
    begin
        filePath := 'd:\aa.log';
        if(FileExists(filePath))  then
        begin
            MmLog.Lines.LoadFromFile(filePath);
            MmLog.Lines.Delimiter := '"';
            MmLog.Lines.DelimitedText := MmLog.Lines.Text;
        end;
    end;
      

  3.   

    MmLog.Lines.Delimiter := '"';                    //设置要除去的特殊字符
    MmLog.Lines.DelimitedText := MmLog.Lines.Text;   //除去特殊字符特殊字符多的话,多来几次就可以了
      

  4.   

    另外你可以用StringReplace()函数,
    用回车符或空窜替换特殊字符,
    就可以达到你要的效果function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
      

  5.   

    那种字符是不可打印的,用UltraEdit可以看到那些字符。
      

  6.   

    用UltraEdit可以看到那些字符的16进制码是:13、04、09等。
    我想请问,怎样在读取这个log文件的时候,以16进制读取,
    当遇到这些代码的时候把前面的数据截取,并将对应的文字内容增加到一个数据库中。谢谢高手帮忙。
      

  7.   

    我抄一段UltraEdit中的
    00000000h: 50 44 45 4D 4C 4F 47 32 36 30 23 09 00 00 00 00 ; PDEMLOG260#.....
    00000010h: 00 00 13 00 00 00 32 30 30 36 2D 3O 33 2D 32 37 ; ......2006-03-27
    00000020h: 20 32 30 3A 31 30 3A 35 30 04 00 00 00 B5 C7 B3 ; 20:10:50....登?
    00000030h: F6 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 ; ?..............
    00000040h: 00 32 30 30 36 2D 30 33 2D 32 37 20 32 30 3A 31 ; .2006-03-27 20:1
    00000050h: 32 3A 31 37 04 00 00 00 B5 C7 B3 F6 00 00 00 00 ; 2:17....登出....比如说,我读到二行有一个13,我把前面的截取,对应的“PDEMLOG260#”放到另一个文件中,
    然后继续往下读,读到发现有一个04,再把“2006-03-27 20:10:50”放在文件的第二行,
    然后继续,读到13,再将“登录”放到第三行,
     .
     .
     .
      

  8.   

    var
      filePath: AnsiString;
    begin
        filePath := 'E:\20060424.log';
        if(FileExists(filePath))  then
        begin
            MmLog.Lines.LoadFromFile(filePath);
            MmLog.Lines.Delimiter := #00;
            MmLog.Lines.DelimitedText := MmLog.Lines.Text;        MmLog.Lines.Delimiter := #13;
            MmLog.Lines.DelimitedText := MmLog.Lines.Text;        MmLog.Lines.Delimiter := #04;
            MmLog.Lines.DelimitedText := MmLog.Lines.Text;
        end;
    end;
      

  9.   

    还是根本就不清楚log文件中有哪些特殊字符?
      

  10.   

    用LoadFromFile不行,就只能读到“PDEMLOG260#”这里。
    请问可以把邮箱告诉我吗?我把那么log文件发给你看看。
      

  11.   

    你的log原来是不是word格式的?
      

  12.   

    Memo不支持#0的字符,把#0用空格替换掉吧
      

  13.   

    我把#00替换掉了,
    现在怎么把“32 30 30 36 2D 30 33 2D 32 37 20 32 30 3A 31 32 3A 31 37 04 00 00 00 B5 C7 B3 F6 ”重新转换成“2006-03-27 20:12:17 登出”?
      

  14.   

    兄弟,你还是把文件读到程序里在用StringReplace替换#0吧,要不你不得读一个文件就去修改文件。
      

  15.   

    就是要把文件按指定的格式提取到memo中?
    你等会,我给你写一段
      

  16.   

    StringReplace也不支持#0,我给改了一下,你试试,看有啥问题没
    function StringReplace(const S, OldPattern, NewPattern: string;
      Flags: TReplaceFlags): string;
    var
      SearchStr, Patt, NewStr: string;
      Offset: Integer;
    begin
      if rfIgnoreCase in Flags then
      begin
        SearchStr := AnsiUpperCase(S);
        Patt := AnsiUpperCase(OldPattern);
      end else
      begin
        SearchStr := S;
        Patt := OldPattern;
      end;
      NewStr := S;
      Result := '';
      while SearchStr <> '' do
      begin
        Offset := Pos(Patt, SearchStr);
        if Offset = 0 then
        begin
          Result := Result + NewStr;
          Break;
        end;
        Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
        NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
        if not (rfReplaceAll in Flags) then
        begin
          Result := Result + NewStr;
          Break;
        end;
        SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      s: string;
      AStream: TMemoryStream;
    begin
      AStream := TMemoryStream.Create;
      AStream.LoadFromFile('C:\a.log');
      SetString(s, nil, AStream.Size);
      AStream.Read(Pointer(s)^, AStream.Size);
      FreeAndNil(AStream);
      s := StringReplace(s,#0,#32,[rfReplaceAll]);
      s := StringReplace(s,#$13,#13#10,[rfReplaceAll]);
      s := StringReplace(s,#$4,#13#10,[rfReplaceAll]);
      Memo1.Text := s;
    end;
      

  17.   

    TKS,问题已解决。
    给分了。
      

  18.   

    不过代码中有个地方还不大明白。
     s := StringReplace(s,#$13,#13#10,[rfReplaceAll]);为什么第二个参数这里写“#$13”,而第三个参数确写“#13”没有那个“$”?
      

  19.   

    $13代表16进制,没有$的就代表十进制,你在UltraEdit里看到的是16进制的,所以要加$