您的位置 首页 java

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

SPL(基于 JVM 的编程语言)可以解析规则或不规则格式的结构化数据文件,以统一的方式表示二维/分层数据等等。

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 解析XML spark-excel 或解析XLS。这使得计算不像使用本机类库那样稳定。Scala 编程语言有缺点。比 Java 更陡峭的 学习曲线 意味着高昂的学习成本,并且过于频繁地发布新版本给实践中的实际应用带来不便。

嵌入式数据库

解析文件并将其写入嵌入式数据库,如 SQLite 、HSQLDB 和 Derby,使得使用 SQL 强大的计算能力成为可能。然而,嵌入式数据库具有复杂的框架,数据加载过程相当麻烦,导致严重的延迟。SQL 强大的计算能力并不总是强大的,因为它只擅长计算二维数据,而不擅长处理 JSON/XML 之类的分层数据。

某些类库,包括simoc/csv JDBC 、xiao321、CsvJdbc、XlsJdbc等文件JDBC驱动程序和可以计算结构化数据文件的 DataFrame 类库,但不成熟,计算能力弱,实用价值不高。 TablesawJoinery

集算器 SPL 是另一种选择。

SPL 是一种基于 JVM 的开源编程语言。它提供了简单的解析方法来读取规则或不规则的TXT、CSV、JSON、XML和XLS文件,提供专门的数据对象以统一的方式表达二维数据和分层数据,并提供丰富的功能,可以满足各种业务计算需求。

文本/CSV

SPL 具有多种内置解析功能,可以使用简单的代码解析各种文本文件,以及用于以一致的方式计算解析的文本文件的丰富函数集。

常规格式的文本文件

二维文本文件,如数据库表,第一行包含列名,一条记录对应一行,并使用固定符号分隔列。逗号分隔的 CSV 和制表符分隔的 TXT 是两种最常见的格式。SPL 提供了 T 使用一行代码解析任何文本文件的功能:

 s=T("D:dataOrders.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 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

SPL 还支持 SQL92 标准的 SQL 语法,涵盖面向集合的计算、case when、with 和嵌套查询。要执行分组和聚合,例如:

 $select year(OrderDate),sum(Amount) from D:/data/Orders.txt group by year(OrderDate)  

JSON/XML

SPL 通过自由访问任何层次级别并以一致的方式计算数据,可以方便地处理 JSON 和 XML 等层次数据。

专门的分层结构化数据对象

SPL 方便地表达 JSON/XML 数据的层次结构。以下是如何从文件中读取分层 JSON 字符串并对其进行解析的示例:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

以下屏幕截图显示了层次结构:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

它类似于读取和解析 XML String

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

访问分层数据

SPL 通过点访问特定级别的数据,通过下标访问特定位置的数据。

  • 获取一组 Client 字段值: A2.(Client)
  • 获取 Orders 第 10 条记录的字段(二维表值): A2(10).Orders
  • 获取第10条记录中的第 5条记录: Orders(A2(10).Orders)(5)

计算分层数据

SPL 以统一代码计算二维数据和分层数据:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

处理从 Web 下载的分层数据

除了本地分层数据外,SPL 还可以处理从 Web 下载的分层数据,例如 WebService 和 RESTful。从 RESTful 中检索分层 JSON 数据并执行条件查询,如下所示:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

许多特殊的数据源,如 MongoDB ElasticSearch 和 SalesForce 也以分层级别存储数据。SPL 可以直接从中检索数据以进行进一步计算。

XLS

SPL 可以通过强封装的 POI 轻松读取/写入各种常规或不规则格式的 XLS 文件,并通过一致的编码使用内置函数和语法计算它们。

SPL 仍然使用 T 函数来读取 常规格式的逐行 XLS 文件

 =T("d:Orders.xls")  

它还以与处理文本文件类似的方式执行后续计算。SPL 使用 xls export 函数生成常规格式的逐行 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 文件。一个例子是将以下文件解析成标准的 二维表 (表序列):

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

该文件的格式非常不规则。直接用 POI 编写 Java 代码将是一项繁重且耗时的工作,但 SPL 代码短小精悍:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

xlscell 函数还可 用于 将数据写入不规则格式的范围。例如,以下 XLS 文件中的蓝色单元格包含不规则的表格标题,我们正在尝试在相应的空白单元格中填充数据:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

POI 代码会臃肿且冗长。SPL 代码如下所示,简洁明了:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

请注意 row6 row9 row11 有连续的单元格,其中 SPL 压缩代码以将它们填充在一起。然而,POI 只能逐个单元地操作。

卓越的计算能力

SPL 提供了大量的 string 函数和 date 函数,以及方便的语法来有效地简化代码,以实现 SQL 和存储过程都难以处理的复杂逻辑。

大量的日期和 字符串函数

除了用于执行常规计算的函数(例如获取指定 date 之前或之后的 a date 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 使用 @b option 使用 二进制 搜索算法对有序数据执行快速过滤:

 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 有以下代码:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

查找 n 订单金额至少占总金额一半的大客户,并按金额降序排列:

开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

跨数据源计算

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);   

将计算代码与 Java 程序分开存储可减少 耦合

对于复杂的 SPL 代码,我们可以先将其保存为 脚本 文件,然后在 Java 程序中调用它,就像我们调用存储过程一样。这有效地减少了计算代码和前端应用程序之间的耦合。

 Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
CallableStatement statement = conn.prepareCall("{call  script FileName(?, ?)}");
statement.setObject(1, "2020-01-01");
statement.setObject(2, "2020-01-31");
statement.execute();   

SPL:通过将计算代码放在 Java 程序之外实现热交换

SPL 是一种解释型语言,可以通过将计算代码置于 Java 程序之外来实现 热交换 。解释型语言实时执行,无需在任何更改后重新编译,无需重新启动 Java 应用程序。这使得维护方便,并创建了一个更稳定的系统。

虽然许多类库可用于计算 TXT/CSV/JSON/XML/XLS,但它们也有其缺陷。SPL 作为一种基于 JVM 的开源编程语言,可以解析规则或不规则格式的结构化数据文件,以统一的方式表示二维数据和分层数据,并使用一致的编码执行常见的 SQL 风格的计算. SPL 拥有更丰富的集合 string date 功能、更便捷的语法和更强大的计算能力。它提供了一个集成友好的JDBC驱动,支持将算法置于应用程序内部或外部,可有效降低系统耦合,实现代码热插拔。

文章来源:智云一二三科技

文章标题:开源 SPL 帮助 Java 处理开放格式的文件:TXT、CSV、JSON、XML 和 XLS

文章地址:https://www.zhihuclub.com/169329.shtml

关于作者: 智云科技

热门文章

网站地图