在字符串上提取多个分隔符

时间:2014-05-10 16:39:42

标签: delphi delphi-7

使用FindFirst搜索文件后,我在子文件夹中获得了一堆文件。所有文件都按名称排列,如

D:\Folders\SubFolder\SubSubFolders\FilesName#Category#Phase#Range.dat

我想获取文件的完整位置,名称,类别,相位范围并将其存储在字符串列表中。例如:

procedure TForm1.Button1Click(Sender: TObject);
var List:TStringList;
begin
  List := TStringList.Create;
  ExtractStrings(['#'], [],
    PChar('D:\Folders\SubFolders\SubSubFolders\FileName#Category#Phase#Range.dat'), List);
  ShowMessage(List.Text);
end; 

这就是我得到的:

D:\Folders\SubFolders\SubSubFolders\FileName
Category
Phase
Range.dat

我想要的只是

D:\Folders\SubFolders\SubSubFolders\
FileName
Category
Phase
Range.dat

任何人都可以详细说明如何实现这一目标?感谢。

精制:

由于我使用的Delphi版本(Delphi 7)找不到正确的方法,我尝试了很多方法:

procedure TForm1.Button1Click(Sender: TObject);
var Lists:TStringList;    
    s, s_filename, s_directory : string;
begin
  s:= 'D:\Folder\SubFolder\SubSubFolder\FileName#Category#Phase#Range.dat';
  s_directory := ExtractFilePath(s);
  s_filename := ExtractFileName(s);
  Memo1.Lines.Clear;
  Memo1.Lines.Add(s);
  Memo1.Lines.Add(s_directory);
  ExtractStrings(['#','.'], [], PChar(s_filename),Memo1.Lines);
end;

并得到我想要的,但是,如何将这些字符串插入字符串数组,如Lists:TStringList,而不是Memo1.Lines?我遇到了访问冲突。

3 个答案:

答案 0 :(得分:2)

您没有指定版本,但如果您正在使用XE6(或Appmethod等效版本),则可以执行此操作:

procedure GetFileDetails(const FileName: string; Details: TStrings);
var
  S: string;
begin
  Details.BeginUpdate;
  try
    Details.Clear;
    S := ExtractFilePath(FileName);
    if S <> '' then Details.Add(S);
    Details.AddStrings(FileName.Substring(S.Length).Split(['#']));
  finally
    Details.EndUpdate;
  end;
end;

string类型(通过帮助程序)在XE3中获得了Split方法,但在XE6之前它是一个完整的狗。

答案 1 :(得分:2)

这里我们直截了当

procedure ExtractDetails( const AFilename : string; ADetails : TStrings );
begin
  ADetails.Delimiter := '#';
  // ADetails.StrictDelimiter := True; // AFAIK work not with Delphi 7
  ADetails.DelimitedText := ExtractFileName( AFilename );
  ADetails.Insert( 0, ExtractFilePath( AFilename ) );
end;

答案 2 :(得分:-1)

http://www.delphibasics.info/home/delphibasicssnippets/simplesplitfunction-readingsettingsfromexecutables

//Author: steve10120
TStringArray = array of string;

function Split(Expression:string; Delimiter:string):TStringArray;
var
  Res:        TStringArray;
  ResCount:   DWORD;
  dLength:    DWORD;
  StartIndex: DWORD;
  sTemp:      string;
begin
  dLength := Length(Expression);
  StartIndex := 1;
  ResCount := 0;
  repeat
    sTemp := Copy(Expression, StartIndex, Pos(Delimiter, Copy(Expression, StartIndex,     Length(Expression))) - 1);
    SetLength(Res, Length(Res) + 1);
    SetLength(Res[ResCount], Length(sTemp));
    Res[ResCount] := sTemp;
    StartIndex := StartIndex + Length(sTemp) + Length(Delimiter);
    ResCount := ResCount + 1;
  until StartIndex > dLength;
  Result := Res;
end;

var
  Strings:  TStringArray;

begin
  Strings := Split('Good||Morning||World||', '||');
  MessageBox(0, PChar(Strings[2]), nil, 0);
end.

拆分\,然后拆分#。

上的最后一个条目