2021 年 5 月 17 日星期一
作者 Sandy Galloway

类型检测库

在过去的几周和几个月里,我们一直在研究一个 类型检测库。它不用于 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);

捐助

我们始终欢迎为添加和改进我们的开源软件而作出的捐助。只需在 Github 上提交一个请求,或者通过 论坛 与我们联系!