2012-02-27 28 views
5

Đây là văn bản phân định của tôi: $ HEHDT, 10.17, T * 28 $ HEHDT, 10.18, T * 2A và vân vân ...Thêm hơn 1 delimiter trong TStringList

Dấu phẩy là dấu phân cách câu của tôi. Tuy nhiên, tôi cũng muốn sử dụng dấu hoa thị làm dấu phân cách của mình.

Output Tôi muốn đạt được là:

$ HEHDT 10.17 T $ HEHDT 10.18 T 2A

Làm thế nào để chỉ định nhiều hơn 1 câu delimiter trong Delphi? Đây là mã tôi có cho đến nay.

var 
    MyStringList: TStringList; 
    i: Integer; 
begin 
    MyStringList:= TStringList.Create; 

    MyStringList.Delimiter := ',' 
    MyStringList.DelimitedText := '$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A' +#13#10; 

    for i= 0 to MyStringList.Count-1 do 
    ShowMessage(MyStringList[i]); 

    MyStringList.Free; 
end; 

Đối với mã trên, chỉ lấy dấu phẩy làm dấu phân cách. Làm cách nào để bao gồm 2 dấu phân cách, cả dấu phẩy và dấu hoa thị?

Rất cám ơn trước! =)

+0

Phiên bản Delphi của bạn là gì? – menjaraz

+0

Bạn nên sử dụng ExtractStrings để tách chuỗi có khả năng hơn – OnTheFly

+0

@ user539484: Miễn là anh ấy có phiên bản Delphi thích hợp. – menjaraz

Trả lời

7

Danh sách chuỗi Delphi đủ tốt để cung cấp cho bạn khả năng phân tích văn bản trên một dấu phân cách "miễn phí". Nếu bạn muốn có một thiết của delimiters - sau đó bạn cần phải sử dụng StrUtils.SplitString:

http://docwiki.embarcadero.com/VCL/en/StrUtils.SplitString

+1

FYI Điều này đã được thêm vào XE – awmross

0

Bạn có thể sử dụng ReplaceString, thay đổi tất cả dấu sao để dấu phẩy. Thay đổi đường dây chuyển nhượng của bạn thành điều này:

String.DelimitedText := ReplaceString('$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A', '*', 
         ',', [rfReplaceAll]); 

Mã của bạn ở trên sẽ hoạt động.

Lưu ý: thuộc tính DelimitedText, tôi tin rằng, cũng xem xét dấu cách là dấu phân cách. Vì vậy, nếu chuỗi của bạn có dấu cách, mã của bạn có thể không hoạt động theo cách bạn có thể mong đợi ...

+3

Nếu bạn đặt StrictDelimeter thành True, nó sẽ không cung cấp cho bạn bất kỳ đau buồn với không gian. –

0
  1. Câu trả lời ngắn gọn là KHÔNG.
  2. Nhưng bạn có thể sử dụng TStringList tùy chỉnh.

TStringList chấp nhận một và chỉ một dấu phân cách.

Trích từ Embarcadero RAD Studio Trợ giúp:

Classes.TStrings.DelimitedText

Mô tả

Đại diện cho tất cả các chuỗi trong TStrings đối tượng như một đơn chuỗi phân cách.

Sử dụng DelimitedText để có được hoặc thiết lập tất cả các chuỗi trong TStrings đối tượng trong một chuỗi đơn, ngăn cách bởi nhân vật quy định bởi thuộc tính Delimiter .


Để có thể sử dụng nhiều hơn một ký tự phân cách bạn nên "mở rộng" khả năng của lớp TStringList bằng cách bắt nguồn một lớp mới từ nó.

Bạn có thể tìm thấy here mã nguồn mẫu của lớp học TStringListEx có hành vi tương tự mà bạn có thể dễ dàng điều chỉnh theo yêu cầu của mình.

Trích

TStringListEx = class(TStringList) 
private 
    FDelimiter: String; 
    function GetDelimitedText: String; 
    procedure SetDelimitedText(const Value: String); 
published 
    property Delimiter: String read FDelimiter write FDelimiter; 
    property DelimitedText: String read GetDelimitedText write SetDelimitedText; 
end; 

Các workaround gồm tiền xử lý chuỗi để thiết lập tài sản với phần còn lại của delimiters (người đầu tiên được thiết lập để sở hữu TStringList.Delimeter) TStringList.DelimitedText có thể đạt được mục tiêu của bạn và ngoài các giải pháp được chỉ ra trong các bài đăng của paulsm4Robert Frank bạn cũng có thể sử dụng Cụm từ thông dụng.

0

Bạn có thể sử dụng hai danh sách chuỗi, một danh sách bằng dấu phẩy, một danh sách bằng dấu hoa thị làm dấu phân tách. Sau đó gán thuộc tính văn bản của thuộc tính văn bản đầu tiên cho thuộc tính văn bản được phân cách của thuộc tính thứ hai.