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


unit STA;interfaceuses System.SysUtils, System.Classes;typeTSta = recordFSeparator: 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;
beginSetLength(FArr, 0);
end;constructor TSta.Create(const aStr: string; const aSeparator: Char);
vartArr: TArray<string>;i: Integer;
beginFSeparator := aSeparator;tArr := aStr.Split([sLineBreak], ExcludeEmpty);SetLength(FArr, Length(tArr));for i := 0 to High(FArr) dobeginFArr[i] := tArr[i].Split([FSeparator]);end;
end;function TSta.GetItem(i,j: Integer): string;
beginResult := '';if (i < 0) or (j < 0) then Exit;if (i < Length(FArr)) and (j < Length(FArr[i])) thenResult := FArr[i, j].Trim;
end;procedure TSta.SetItem(i,j: Integer; Value: string);
vark,n: Integer;
beginif Value.Trim = '' then Exit;if Length(FArr) = 0 then FSeparator := ';';n := Length(FArr);if i >= n thenbeginSetLength(FArr, i+1);for k := n to i - 1 do SetLength(FArr[k], 1);end;if j >= Length(FArr[i]) then SetLength(FArr[i], j+1);FArr[i,j] := Value.Trim;
end;function TSta.GetRow(i: Integer): string;
beginResult := '';if i < Length(FArr) thenbeginif Length(FArr[i]) > 0 thenResult := Result.Join(FSeparator, FArr[i]);end;
end;function TSta.GetRowCount: Integer;
beginResult := Length(FArr);
end;procedure TSta.SetRow(i: Integer; Value: string);
vark,n: Integer;
beginif Value.Trim = '' then Exit;if Length(FArr) = 0 then FSeparator := ';';n := Length(FArr);if i >= n thenbeginSetLength(FArr, i+1);for k := n to i - 1 do SetLength(FArr[k], 1);end;FArr[i] := Value.Split([FSeparator]);
end;procedure TSta.SetRowCount(const Value: Integer);
beginSetLength(FArr, Value);
end;procedure TSta.SetSeparator(const Value: Char);
beginFSeparator := Value;if Length(FArr) = 0 then SetLength(FArr, 1); //直接使用索引赋值时, 会根据 Length(FArr) 是否为 0 来设置默认分隔符
end;class operator TSta.Explicit(const aStr: string): TSta;
beginResult := TSta.Create(aStr);
end;class operator TSta.Implicit(const aStr: string): TSta;
beginResult := TSta.Create(aStr);
end;function TSta.ToString: string;
vari: Integer;
beginif Length(FArr) = 0 then Exit('');Result := Rows[0];for i := 1 to High(FArr) doResult := Result + sLineBreak + Rows[i];
end;procedure TSta.LoadFromFile(const aFileName: string; aEncoding: TEncoding);
beginif not FileExists(aFileName) then Exit;if aEncoding = nil then aEncoding := TEncoding.Default;with TStringList.Create do beginLoadFromFile(aFileName, aEncoding);Self := Text;Free;end;
end;procedure TSta.SaveToFile(const aFileName: string; aEncoding: TEncoding);
beginif aEncoding = nil then aEncoding := TEncoding.Default;with TStringList.Create do beginText := Self.ToString;SaveToFile(aFileName, aEncoding);Free;end;
end;end.


测试:


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

写了一个字符串的二维表: TSta相关推荐

  1. 一维转二维_Excel – 一维表和二维表相互转换,只要一个“=”搞定

    关于一维表和二维表的互相转化方法,我真的写过很多种了.且不说在各种案例中顺带提到的技巧,单独开篇讲的,就有以下这些: (头条号功能维护中,暂时无法添加超链接,有兴趣的读者请关注我,查看下历史记录吧) ...

  2. mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...

    [判断题]DELETE语句功能是对表中所有记录或满足条件的记录进行批量删除. [填空题]The computer's entire ____ was on a single board. [单选题]下 ...

  3. 一个二维表查询的实现

    1.示例表结构及测试数据 create table ROW_COL_CONVER ( CODE VARCHAR2(10), MONTH VARCHAR2(10), NUM VARCHAR2(10) ) ...

  4. linux音源管理 二维表,Oracle【二维表管理:约束】

    1.简单的表创建和字段类型 最简单的方式去创建表(没有添加主键之类的约束条件) [Oracle的字段类型] number:数值类型 --整数类型:number(a) 总长度a --小数类型:numbe ...

  5. 数据建模中的二维表和一维表!

    [讨论] 什么是表/一维表/二维表,哪位给个准确的定义 [复制链接] 透视表要求是一维表, 那什么是表.一维表.二维表呢?查了一下午也没有找到准确的定义, 把找到的内容罗列如下: ++++++++++ ...

  6. python二维表转一维表_曾贤志从零基础开始学用Python处理Excel数据第1,2季

    教程简介: =====[曾贤志]从零基础开始用Python处理Excel数据====== 1-1 什么是python? .mp4 1-2 为什么要学习用Python处理Excel表格? .mp4 1- ...

  7. 二维表 转一维表 mysql_Excel二维表转换成一维表(2种方法)

    今天大年初四,春节假期还剩三天了,每逢佳节胖三斤,亲们可要注意控制饮食了,要不然春节后无脸见人哟.闲话少说,今日分享如下. 在做数据处理的时候,有的时候为了处理方便我们需要将二维的数据表处理成一维的数 ...

  8. PowerBI强大的数据汇总能力:将几十张Excel二维表批量转换成一维表进行可视化分析

    目录 如何分析单张二维表数据 如何用PowerBI搞定几十张二维表 操作步骤 打开Power BI Desktop,获取数据,自文件夹,选择数据源路径,确定 选择转换数据 保留content列,删除其 ...

  9. 在excel中使用offset和match函数进行二维表对二维表的匹配

    这次我们来介绍一个可以快速完成二维表对二维表匹配的方法. 需求背景: 如上图所示,我们现在有两个二维表需要进行匹配,上面这个是匹配源表,我们需要拿这个源表匹配到需匹配的二维表上. 该表是我们的匹配源表 ...

  10. PyQt5最全39 表格之QTableView显示二维表数据

    PyQt5最全39 表格之QTableView显示二维表数据 from PyQt5.QtWidgets import * from PyQt5.QtGui import * import syscla ...

最新文章

  1. mac u盘文件过大 拷贝不进去_使用mac时文件太大无法拷贝怎么办
  2. 用泛型实现参数化类型
  3. 等重构完这系统,我就辞职
  4. idea设置java scala等代码自动换行
  5. 我所认识的JavaScript正则表达式
  6. 在采用vue-cli Post Get
  7. “无法找到运行搜索助理需要的一个文件”的解决办法
  8. 安装LR11,到执行产品配置时,停止不动了
  9. aspx怎么转成java,Asp.net 2.0 中.aspx请求,即如何生成响应的Html文件(原创)
  10. linux7.0下mysql_CentOS 7.0下使用yum安装MySQL
  11. 设计模式----原型模式(C++实现)
  12. 计算机软考信息处理技术员试题及答案,软考信息处理技术员模拟试题及答案(一)...
  13. 飞猪IP教你如何网络互换:电信,联通,移动网络互换
  14. SVG排版教程 | SVG排版入门基础知识汇总
  15. asp.net简单实现导出excel报表
  16. Android 仿微信群聊头像
  17. C语言:判断一个数是否为素数
  18. Java程序员日常开发提效工具(谷歌,Idea)-长期更新
  19. mysql meb物理备份脚本
  20. ROC及AUC计算方法及原理

热门文章

  1. shell的EOF用法
  2. sql中的日期函数和case函数
  3. 2b青年欢乐多之地铁奇幻记
  4. gsoap使用心得![转]
  5. is内存地址 id 地址比较 小数据池概念
  6. sed修炼系列(二):sed武功心法(info sed翻译+注解)
  7. 2016年10月20日 .NET Core 1.0.2 更新
  8. HTML5的绘画支持(五)
  9. WEB界面测试用例~ 收藏
  10. 【转】在IIS 7.0上使用自签证书来启用SSL