写了一个字符串的二维表: TSta

时间:2023-03-09 09:00:00
写了一个字符串的二维表: TSta

STA 单元 (用到 System.SysUtils.TStringHelper):

------------------------------------------------------------------------------------------------------------------------------------------

unit STA;

interface

uses System.SysUtils, System.Classes;

type
TSta = record
FSeparator: Char;
FArr: TArray<TArray<string>>;
constructor Create(const aStr: string; const aSeparator: Char = ';'); overload;
class operator Explicit(const aStr: string): TSta;
class operator Implicit(const aStr: string): TSta;
function GetItem(i,j: Integer): string;
procedure SetItem(i,j: Integer; Value: string);
function GetRow(i: Integer): string;
procedure SetRow(i: Integer; Value: string);
procedure SetSeparator(const Value: Char);
function GetRowCount: Integer;
procedure SetRowCount(const Value: Integer);
function ToString: string;
procedure Clear;
procedure LoadFromFile(const aFileName: string; aEncoding: TEncoding = nil);
procedure SaveToFile(const aFileName: string; aEncoding: TEncoding = nil);
property Separator: Char read FSeparator write SetSeparator;
property RowCount: Integer read GetRowCount write SetRowCount;
property Items[i,j: Integer]: string read GetItem write SetItem; default;
property Rows[i: Integer]: string read GetRow write SetRow;
end; implementation { TSta } procedure TSta.Clear;
begin
SetLength(FArr, );
end; constructor TSta.Create(const aStr: string; const aSeparator: Char);
var
tArr: TArray<string>;
i: Integer;
begin
FSeparator := aSeparator;
tArr := aStr.Split([sLineBreak], ExcludeEmpty);
SetLength(FArr, Length(tArr));
for i := to High(FArr) do
begin
FArr[i] := tArr[i].Split([FSeparator]);
end;
end; function TSta.GetItem(i,j: Integer): string;
begin
Result := '';
if (i < ) or (j < ) then Exit;
if (i < Length(FArr)) and (j < Length(FArr[i])) then
Result := FArr[i, j].Trim;
end; procedure TSta.SetItem(i,j: Integer; Value: string);
var
k,n: Integer;
begin
if Value.Trim = '' then Exit;
if Length(FArr) = then FSeparator := ';';
n := Length(FArr);
if i >= n then
begin
SetLength(FArr, i+);
for k := n to i - do SetLength(FArr[k], );
end;
if j >= Length(FArr[i]) then SetLength(FArr[i], j+);
FArr[i,j] := Value.Trim;
end; function TSta.GetRow(i: Integer): string;
begin
Result := '';
if i < Length(FArr) then
begin
if Length(FArr[i]) > then
Result := Result.Join(FSeparator, FArr[i]);
end;
end; function TSta.GetRowCount: Integer;
begin
Result := Length(FArr);
end; procedure TSta.SetRow(i: Integer; Value: string);
var
k,n: Integer;
begin
if Value.Trim = '' then Exit;
if Length(FArr) = then FSeparator := ';';
n := Length(FArr);
if i >= n then
begin
SetLength(FArr, i+);
for k := n to i - do SetLength(FArr[k], );
end;
FArr[i] := Value.Split([FSeparator]);
end; procedure TSta.SetRowCount(const Value: Integer);
begin
SetLength(FArr, Value);
end; procedure TSta.SetSeparator(const Value: Char);
begin
FSeparator := Value;
if Length(FArr) = then SetLength(FArr, ); //直接使用索引赋值时, 会根据 Length(FArr) 是否为 来设置默认分隔符
end; class operator TSta.Explicit(const aStr: string): TSta;
begin
Result := TSta.Create(aStr);
end; class operator TSta.Implicit(const aStr: string): TSta;
begin
Result := TSta.Create(aStr);
end; function TSta.ToString: string;
var
i: Integer;
begin
if Length(FArr) = then Exit('');
Result := Rows[];
for i := to High(FArr) do
Result := Result + sLineBreak + Rows[i];
end; procedure TSta.LoadFromFile(const aFileName: string; aEncoding: TEncoding);
begin
if not FileExists(aFileName) then Exit;
if aEncoding = nil then aEncoding := TEncoding.Default;
with TStringList.Create do begin
LoadFromFile(aFileName, aEncoding);
Self := Text;
Free;
end;
end; procedure TSta.SaveToFile(const aFileName: string; aEncoding: TEncoding);
begin
if aEncoding = nil then aEncoding := TEncoding.Default;
with TStringList.Create do begin
Text := Self.ToString;
SaveToFile(aFileName, aEncoding);
Free;
end;
end; end.

测试:


uses STA;

procedure TForm1.Button1Click(Sender: TObject);
var
S: TSta;
str: string;
begin
S := 'AAA;BBB;CCC' + sLineBreak + '111;222;333'; //可以从字符串隐式或显式地转换到 TSta str := S[,]; //AAA
str := S[,]; //
str := S[,]; //越界读取返回空 str := S.Rows[]; //AAA;BBB;CCC
str := S.Rows[]; //;; str := S.ToString; //AAA;BBB;CCC
//;: S.Separator := '&'; //更换分隔符; 默认是分号; 也可在 Create 时指定
str := S.Rows[]; //&&
ShowMessage(str);
end; procedure TForm1.Button2Click(Sender: TObject);
var
S: TSta;
str: string;
begin
S[,] := 'aaa';
S[,] := 'bbb';
S[,] := 'ccc';
S[,] := 'zzz'; str := S.ToString; //aaa;bbb;ccc
//
//;;zzz S.Rows[] := '111;222;333';
str := S.ToString; //aaa;bbb;ccc
//;;
//;;zzz
// ShowMessage(str);
end; procedure TForm1.Button3Click(Sender: TObject);
const
nFileName = 'c:\temp\staTest.txt';
var
S: TSta;
str: string;
begin
S[,] := 'aaa';
S[,] := 'bbb';
S[,] := 'ccc';
S[,] := '';
S[,] := '';
S[,] := '';
S[,] := '';
S.SaveToFile(nFileName); //保存到文件
S.Clear;
str := S[,]; //空
// ShowMessage(str); S.LoadFromFile(nFileName); //从文件读取
str := S[,]; //aaa
str := S.Rows[]; //aaa;bbb;ccc
// ShowMessage(str);
end;

http://www.cnblogs.com/del/