类型检测库
在过去的几周和几个月里,我们一直在研究一个 类型检测库。它不用于 DataTables,但在 Cloudtables 中用于自动检测数据数组中的类型。在 CloudTables 中,数据数组表示数据列,这在从 CSV、JSON 或 Excel 文件导入数据时对于自动类型检测非常有用。我们已在 npm 上作为一个开源库发布了此库,希望它对 Web 开发社区有所帮助。
在这篇博文中,我将介绍使用此新库可以识别的不同类型和格式。
可检测类型
类型检测库可以检测以下类型。
- 数字
- HTML
- 日期和时间
- 字符串
- 混合
这涵盖了数据可以显示的大多数格式。
数字
类型检测库可以多种形式检测数字。其中包括
- JS 数字(
100
)[100, 200, 300]
- 数字字符串(
'100'
)['100', '200', '300']
- 带有前缀的数字字符串(
'$100'
)['$100', '$200', '$300']
- 带有后缀的数字字符串(
'100 cm'
)['100 cm', '200 cm', '300 cm']
- 同时带有前缀和后缀的数字字符串(
'$100 per month'
)['$100 per month', '$200 per month', '$300 per month']
- 带有默认小数点(
'.'
)的所有上述内容(100.5, '100.5', '$100.50', '100.5 cm', '$100.50 per month'
) - 带有默认千位分隔符(
','
)的所有上述内容(除 JS 数字之外)('100,000.5', '$100,000.50', '100,000.5 cm', '$100,000.50 per month'
)
检测到的任何前缀或后缀在所有数据点中都将会是通用的,但空数据点除外。如果存在不一致,则返回的类型将为字符串。
HTML
可以使用类型检测库检测 HTML。任何由字符串组成的数据集都可以被识别为 HTML,前提是其中存在至少一个有效的 HTML 标签。如果没有有效的 HTML 标签,则返回字符串类型。
以下是一些 HTML 数据示例
['<span>I</span>', '<span>am</span>', '<span>HTML</span>']
['I', '<span>am</span>', 'HTML']
日期和时间
日期和时间是此库中最具挑战性的部分。日期格式使用与 Moment 相同的标记来识别。没有一个具体的日期格式检测库,可能永远也不会出现。
考虑一下日期 10/10/10
。这可能是众多可能格式中的一种,因为无法区分日期、月份或年份。很幸运,我们通常考虑的是大型数据集,而不是单个值。在一个整体数据集中,不可能从传入的值中推导出任何信息的情况不太可能出现。此库将始终返回一个对传入数组中每个元素都有效的格式,以做出最佳猜测。然而,大多数时候,都能相当准确地识别出数据格式。
Github 上的 自述文件 中列出了受支持令牌列表。这些令牌可以按任意顺序排列,但为了使检测成为可能,有一些条件。首先,不能重复使用令牌 - 在现实世界日期中没有此类用例。其次,如果使用了诸如 MM
之类的令牌,则会立即排除 M
令牌。这两个令牌之间的唯一区别是对于小于 10 的值,前面有一个“0” - 再次,没有意义将它们包含两次。除这些条件外,还会进行一系列逻辑步骤,以尝试准确识别整个数据集的有效时刻格式。
如果没有提供数据的时间元素,则会返回 date
类型。既有日期又有时间的数据将被赋予类型 datetime
。仅提供时间的数据将被赋予类型 time
,
如果提供的数据集具有多种不同的格式,则将返回混合类型。这可能像额外一列或某个位置上的 0
一样简单,因此确保数据的格式正确非常重要。
以下提供了几个示例
- 日期
['2021-03-11','2020-12-25','2021-01-01']
-YYYY-MM-DD
['12-25-2020', '03-1-2021', '01-11-1999']
-MM-D-YYYY
['March 5th, 2021', 'April 16th, 2022', 'May 27th, 2023']
-MMMM Do, YYYY
- 日期时间
['2021-03-11 08:17','2020-12-25 09:47','2021-01-01 15:04']
-YYYY-MM-DD HH:mm
['12-25-2020 08:17 AM', '03-1-2021 09:47 AM', '01-11-1999 03:04 PM']
-MM-D-YYYY hh:mm A
['March 5th, 2021 08:17:33', 'April 16th, 2022 09:47:01', 'May 27th, 2023 15:04:25']
-MMMM Do, YYYY HH:mm:ss
- 时间
['08:17','09:47','15:04']
-HH:mm
['08:17 AM', '09:47 AM', '03:04 PM']
-hh:mm A
['08:17:33', '09:47:01', '15:04:25']
-HH:mm:ss
- 混合
['2021-03-11 08:17','2020/12/25 09:47','2021-01-01 15:04']
- 一个用斜杠隔开,另一个用短划线隔开['12-25-2020 08:17 AM', '03-1-2021 09:47 AM', '01-11-1999 15:04']
- AM/PM 不一致以及 24 小时HH
['March 5th, 2021 08:17:33', 'April 16th, 2022 09:47:01', 'May 27th 2023 15:04:25']
- 最后一个值中缺少逗号
混合
如果在数据集中识别出多个不同类型或格式,则会返回混合类型。以下列出了一些示例。
['2021-03-11 08:17','2020/12/25 09:47','2021-01-01 15:04']
不同格式 [17, 'Some string', '2021-05-17']
数字、字符串和日期混合
字符串
无法归类为上述任何类型的的数据将被赋予字符串类型。
Excel
Cloudtables 允许从 Excel 电子表格导入数据。因此,此库需要能够识别 Excel 数据中的类型。上述所有类型都可以从通过以下方式传入的数据中识别出来。
[{ value: '1', excel: '#' },{ value: '2', excel: '#' },{ value: '3', excel: '#' }]
这会返回一个小数位数为 0 的数字类型,无前缀或后缀。该对象中的属性值对表示单元格值及应用于该单元格的格式。这两个属性包含关键的信息,用于标识类型和格式。
用法
如果您在阅读此博文后,可以想到利用类型检测库的方法,可以通过以下步骤在您的项目中使用它。
安装
该库提供 npm 并在 MIT 许可下提供。您可以通过运行安装它
npm install @datatables/type-detector
初始化
使用方法非常简单,仅涉及导入、初始化和调用单个 API 方法。下面包含了 JavaScript 和 TypeScript 的初始化代码。当调用 `typeDetect()` 函数时,会传递一个单维度的数据数组。然后该库将返回表示该数组中所用类型和格式的对象。
ES3
var TypeDetect = require('@datatables/type-detector');
var detector = new TypeDetect["default"]();
var type = detector.typeDetect(dataArray);
ES6
import TypeDetect from '@datatables/type-detector';
let detector = new TypeDetect();
let type = detector.typeDetect(dataArray);