java开源表格(开源SPL帮助)
在 Java 应用程序中处理 TXT、CSV、JSON、XML 和 XLS 等开放格式的数据文件是很常见的。Java 中的硬编码极其复杂,因此我们经常求助于某些现成的开源包,但每个包都有其弱点。
解析库这种类型的类库可以通过比硬编码数据检索更简单的编码过程来读取 Java 中的外部文件作为后者的内部对象。常见产品包括:
- 用于解析 TXT 和 CSV 文件的 OpenCSV
- 用于解析 JSON 文件的 SJ.json、Gson 和 JsonPath
- XOM、Xerces-J、JDOM 和 Dom4j 旨在解析 XML 文件
- POI,即 XML 解析器
JsonPath 提供 JsonPath 语法,Dom4J 提供 XPath 语法来处理简单的过滤计算。但是,这些库一般计算能力较弱,需要借助硬编码或其他类库来完成计算任务。
火花Spark作为Scala的类库,支持结构化的数据文件,具有比较强的计算能力。该库的缺点是缺乏解析能力,需要第三方类库的帮助,如spark-xml解析XMLspark-excel或解析XLS。这使得计算不像使用本机类库那样稳定。Scala 编程语言有缺点。比 Java 更陡峭的学习曲线意味着高昂的学习成本,并且过于频繁地发布新版本给实践中的实际应用带来不便。
嵌入式数据库解析文件并将其写入嵌入式数据库,如 SQLite、HSQLDB 和 Derby,使得使用 SQL 强大的计算能力成为可能。然而,嵌入式数据库具有复杂的框架,数据加载过程相当麻烦,导致严重的延迟。SQL 强大的计算能力并不总是强大的,因为它只擅长计算二维数据,而不擅长处理 JSON/XML 之类的分层数据。
某些类库,包括simoc/csvjdbc、xiao321、CsvJdbc、XlsJdbc等文件JDBC驱动程序和可以计算结构化数据文件的DataFrame类库,但不成熟,计算能力弱,实用价值不高。TablesawJoinery
集算器 SPL 是另一种选择。
SPL 是一种基于 JVM 的开源编程语言。它提供了简单的解析方法来读取规则或不规则的TXT、CSV、JSON、XML和XLS文件,提供专门的数据对象以统一的方式表达二维数据和分层数据,并提供丰富的功能,可以满足各种业务计算需求。
文本/CSVSPL 具有多种内置解析功能,可以使用简单的代码解析各种文本文件,以及用于以一致的方式计算解析的文本文件的丰富函数集。
常规格式的文本文件二维文本文件,如数据库表,第一行包含列名,一条记录对应一行,并使用固定符号分隔列。逗号分隔的 CSV 和制表符分隔的 TXT 是两种最常见的格式。SPL 提供了T使用一行代码解析任何文本文件的功能:
s=T("D:\\data\\Orders.csv")
SPL 使用一个导入函数,该函数可以使用一组丰富的选项来解析它们。要解析文本文件,请用水平双破折号分隔。例如:
s=file("D:/Orders.txt").import@t(;,"--")
在解析的文本文件上,SPL 可以毫不费力地完成 SQL 风格的计算:
- 过滤器:s.select(Amount>1000 && Amount<=3000 && like(Client,"*s*"))
- 排序:s.sort(Client,-Amount)
- 区别:s.id(Client)
- 组和聚合:s.groups(year(OrderDate);sum(Amount))
- 加入:join(T ("D:/data/Orders.csv"):O,SellerId; T("D:/data/Employees.txt"):E,EId)
- 获取 topN:s.top(-3;Amount)
- 在每组中获得 TopN:s.groups(Client;top(3,Amount))
一般来说,这样的文本文件不能直接解析成结构化数据。SPL 提供灵活的功能语法,通过简单的处理获得所需的数据。例如,在文本文件中,每三行形成一个记录,每条记录的第二行包含多个字段。我们正在尝试重新排列文件以将其转换为结构化文件,按第 3和第 4字段排序:
SPL 还支持 SQL92 标准的 SQL 语法,涵盖面向集合的计算、case when、with 和嵌套查询。要执行分组和聚合,例如:
$select year(OrderDate),sum(Amount) from D:/data/Orders.txt group by year(OrderDate)
SPL 通过自由访问任何层次级别并以一致的方式计算数据,可以方便地处理 JSON 和 XML 等层次数据。
专门的分层结构化数据对象SPL 方便地表达 JSON/XML 数据的层次结构。以下是如何从文件中读取分层 JSON 字符串并对其进行解析的示例:
以下屏幕截图显示了层次结构:
它类似于读取和解析 XML string:
访问分层数据
SPL 通过点访问特定级别的数据,通过下标访问特定位置的数据。
- 获取一组Client字段值:A2.(Client)
- 获取Orders第 10 条记录的字段(二维表值):A2(10).Orders
- 获取第10条记录中的第 5条记录:Orders(A2(10).Orders)(5)
SPL 以统一代码计算二维数据和分层数据:
处理从 Web 下载的分层数据
除了本地分层数据外,SPL 还可以处理从 Web 下载的分层数据,例如 WebService 和 RESTful。从 RESTful 中检索分层 JSON 数据并执行条件查询,如下所示:
许多特殊的数据源,如 MongoDB、ElasticSearch 和 SalesForce 也以分层级别存储数据。SPL 可以直接从中检索数据以进行进一步计算。
XLSSPL 可以通过强封装的 POI 轻松读取/写入各种常规或不规则格式的 XLS 文件,并通过一致的编码使用内置函数和语法计算它们。
SPL 仍然使用T函数来读取 常规格式的逐行 XLS 文件:
=T("d:\\Orders.xls")
它还以与处理文本文件类似的方式执行后续计算。SPL 使用xlsexport函数生成常规格式的逐行 XLS 文件。要将数据表写入A1新 XLS 文件的第一张表并使第一行包含列名,例如,SPL 只需要一行代码:
=file("e:/result.xlsx").xlsexport@t(A1)
xlsexport函数有很多功能。它可以将数据表写入指定的工作表,将数据表的某些行写入它,或者将数据表的指定列写入它:
=file("e:/scores.xlsx").xlsexport@t(A1,No,Name,Class,Maths)
xlsexport函数也可以方便地用于追加数据。假设有一个包含数据的 XLS 文件,我们试图将数据表中A1的数据附加到文件末尾,其外观与现有 XLS 文件的最后一行相同:
=file("e:/scores.xlsx").xlsexport@a(A1)
SPL 使用函数从不规则格式的逐行 XLS 文件中xlsimport读取数据。该函数具有丰富而简单的功能。
导入不带列标题的 XLS 文件,详细数据从第一行开始:file("D:\\Orders.xlsx").xlsimport().
- 通过跳过前两行中的标题来导入 XLS 文件:file("D:/Orders.xlsx").xlsimport@t(;,3)
- 从第3行到第 10行导入 XLS 数据:file("D:/Orders.xlsx").xlsimport@t(;,3:10)
- 导入 XLS 文件的 3 列:file("D:/Orders.xlsx").xlsimport@t(OrderID,Amount,OrderDate)
- 导入名为“ sales”的工作表:file("D:/Orders.xlsx").xlsimport@t(;"sales")
该xlsimport函数还具有其他功能,例如向后读取 N 行、使用密码打开 XLS 文件以及读取大型 XLS 文件。
具有极不规则格式的 XLS 文件SPL 使用xlscell函数在给定工作表的指定范围内读取/写入数据。要读取 中的单元格 A2 sheet1,例如:
=file("d:/Orders.xlsx").xlsopen().xlscell("C2")
SPL 能够以其灵活的语法解析自由格式的 XLS 文件。一个例子是将以下文件解析成标准的二维表(表序列):
该文件的格式非常不规则。直接用 POI 编写 Java 代码将是一项繁重且耗时的工作,但 SPL 代码短小精悍:
该xlscell函数还可 用于 将数据写入不规则格式的范围。例如,以下 XLS 文件中的蓝色单元格包含不规则的表格标题,我们正在尝试在相应的空白单元格中填充数据:
POI 代码会臃肿且冗长。SPL 代码如下所示,简洁明了:
请注意row6,row9和row11有连续的单元格,其中 SPL 压缩代码以将它们填充在一起。然而,POI 只能逐个单元地操作。
卓越的计算能力SPL 提供了大量的string函数和date函数,以及方便的语法来有效地简化代码,以实现 SQL 和存储过程都难以处理的复杂逻辑。
大量的日期和字符串函数除了用于执行常规计算的函数(例如获取指定date之前或之后的 adate和string截断)之外,SPL 还提供了更多的日期和string函数,在数量和功能上都超过了 SQL。
获取指定季度数之前或之后的日期:
elapse@q("2020-02-27",-3) // 返回 2019-05-27
获取 N 个工作日后的日期:
workday(date("2022-01-01"),25) // 返回 2022-02-04
String功能:检查a是否string全部由字母组成。
isdigit("12345") // 返回真
string在指定子字符串之前获取 a :
substr@l("abCDcdef","cd") // 返回 abCD
string通过竖线将a 拆分为子字符串数组:[ "aa","bb","cc"]
Java -复制代码:
"aa|bb|cc".split("|") // 返回
SPL 还提供一些函数来获取几年之前或之后的日期、获取date属于哪个季度、string根据正则表达式拆分 a、获取 SQL 语句的where或select部分、从 a 获取单词string、按特定拆分 HTML标记等
Convenient Function 语法SPL 支持函数选项。这允许具有相似功能的函数使用相同的名称并使用不同的选项来区分它们。函数的基本功能select是过滤数据。如果我们需要获得第一个符合条件的记录,我们使用@1选项:
T.select@1(Amount>1000)
SPL 使用@boption 使用二进制搜索算法对有序数据执行快速过滤:
T.select@b(Amount>1000)
SPL 使用@o选项对按分组字段排序的数据执行基于顺序的分组,该分组字段放置具有相同分组字段值的相邻记录:
T.groups@o(Client;sum(Amount))
功能选项可以一起工作:
Orders.select@1b(金额>1000)
通常,结构化计算函数中的参数很复杂。例如,SQL 使用大量关键字将语句的参数分成多个组,导致语句结构不一致。SPL 具有分层参数。它采用分号、逗号和冒号将参数标识为三个级别,并以简单的方式编写复杂的参数。
Orders.select@1b(Amount>1000)
SPL 具有出色的计算能力。它处理 SQL/存储过程难以轻松处理的基于顺序的计算、面向集合的计算、连接和逐步计算。要计算股票连续上涨的最长天数,SPL 有以下代码:
查找n订单金额至少占总金额一半的大客户,并按金额降序排列:
跨数据源计算
SPL 支持多种数据源,不仅包括结构化数据文件,还包括各种类型的数据库和 NoSQL,如 Hadoop、Redis、Kafka 和 Cassandra,因此可以完成涉及不同类型源的计算,例如 和 之间的xls连接txt:
=join(T("D:/Orders.xlsx"):O,SellerId; T("D:/Employees.txt"):E,EId)
SPL 提供了一个方便易用的 JDBC 驱动程序。一段简单的代码,比如 SQL,可以直接嵌入到 Java 程序中:
Class.forName("com.esproc.jdbc.InternalDriver");
Connection connection =DriverManager.getConnection("jdbc:esproc:local://");
Statement statement = connection.createStatement();
String str="=T(\"D:/Orders.xls\").select(Amount>1000 && Amount<=3000 &&
like(Client,\"*s*\"))";
ResultSet result = statement.executeQuery(str);
对于复杂的 SPL 代码,我们可以先将其保存为脚本文件,然后在 Java 程序中调用它,就像我们调用存储过程一样。这有效地减少了计算代码和前端应用程序之间的耦合。
Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
CallableStatement statement = conn.prepareCall("{call scriptFileName(?, ?)}");
statement.setObject(1, "2020-01-01");
statement.setObject(2, "2020-01-31");
statement.execute();
SPL 是一种解释型语言,可以通过将计算代码置于 Java 程序之外来实现热交换。解释型语言实时执行,无需在任何更改后重新编译,无需重新启动 Java 应用程序。这使得维护方便,并创建了一个更稳定的系统。
虽然许多类库可用于计算 TXT/CSV/JSON/XML/XLS,但它们也有其缺陷。SPL 作为一种基于 JVM 的开源编程语言,可以解析规则或不规则格式的结构化数据文件,以统一的方式表示二维数据和分层数据,并使用一致的编码执行常见的 SQL 风格的计算. SPL 拥有更丰富的集合string和date功能、更便捷的语法和更强大的计算能力。它提供了一个集成友好的JDBC驱动,支持将算法置于应用程序内部或外部,可有效降低系统耦合,实现代码热插拔。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com