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

類型偵測函式庫

過去幾週和幾個月,我們一直在開發一個 類型偵測函式庫。它沒有在 DataTables 中使用,但它在 Cloudtables 中用於自動偵測資料陣列中的類型。在 CloudTables 中,資料陣列代表資料的欄位,這對於從 CSV、JSON 或 Excel 檔案匯入資料時的自動類型偵測非常有用。我們已將其作為開放原始碼函式庫發佈在 npm 上,希望它對網路開發社群有所幫助。

在這篇部落格文章中,我將介紹可以使用這個新函式庫識別的不同類型和格式。

可偵測的類型

類型偵測函式庫可以偵測以下類型。

  • 數字
  • 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 上的 ReadMe 中有一個支援標記的清單。這些標記可以以任何順序排列,但是有一些條件可以使偵測可行。首先,任何標記都不能使用兩次 - 在現實世界的日期中沒有這種使用情況。其次,如果使用了像 MM 這樣的標記,則立即排除 M 標記。這兩者之間的唯一區別是在小於 10 的值開頭的 '0' - 再次將它們包含兩次是沒有意義的。除了這些條件之外,還會發生一系列邏輯步驟,以嘗試準確識別整個資料集的有效 moment 格式。

如果提供的資料沒有時間元素,則將傳回 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: '#' }]

這將傳回沒有小數點、前綴或後綴的數字類型。物件中的屬性值對表示單元格的值以及應用於該單元格的格式。這兩者都包含在識別類型和格式時的關鍵資訊。

使用方式

如果在閱讀這篇部落格文章後,您想到可以使用類型偵測函式庫的方法,則需要執行以下步驟以在您的專案中使用它。

安裝

該函式庫在 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 上建立提取請求,或透過 論壇 與我們聯繫!