類型偵測函式庫
過去幾週和幾個月,我們一直在開發一個 類型偵測函式庫。它沒有在 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 上建立提取請求,或透過 論壇 與我們聯繫!