w-data-csv 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +9 -0
- package/.eslintignore +3 -0
- package/.eslintrc.js +54 -0
- package/.jsdoc +25 -0
- package/README.md +54 -0
- package/SECURITY.md +5 -0
- package/babel.config.js +14 -0
- package/dist/w-data-csv.umd.js +7 -0
- package/dist/w-data-csv.umd.js.map +1 -0
- package/docs/WDataCsv.mjs.html +242 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/global.html +787 -0
- package/docs/index.html +81 -0
- package/docs/scripts/collapse.js +20 -0
- package/docs/scripts/linenumber.js +25 -0
- package/docs/scripts/nav.js +12 -0
- package/docs/scripts/polyfill.js +4 -0
- package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/scripts/prettify/lang-css.js +2 -0
- package/docs/scripts/prettify/prettify.js +28 -0
- package/docs/scripts/search.js +83 -0
- package/docs/styles/jsdoc.css +765 -0
- package/docs/styles/prettify.css +79 -0
- package/g-read.mjs +15 -0
- package/g-test-in.csv +3 -0
- package/g-test-out.csv +3 -0
- package/g-write.mjs +16 -0
- package/package.json +30 -0
- package/src/WDataCsv.mjs +173 -0
- package/test/PCA.test.mjs +125 -0
- package/test/cluster.test.mjs +135 -0
- package/toolg/addVersion.mjs +4 -0
- package/toolg/cleanFolder.mjs +4 -0
- package/toolg/gDistRollup.mjs +38 -0
- package/toolg/gDocsExams.mjs +48 -0
- package/toolg/modifyReadme.mjs +4 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
.pln {
|
|
2
|
+
color: #ddd;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
/* string content */
|
|
6
|
+
.str {
|
|
7
|
+
color: #61ce3c;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* a keyword */
|
|
11
|
+
.kwd {
|
|
12
|
+
color: #fbde2d;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* a comment */
|
|
16
|
+
.com {
|
|
17
|
+
color: #aeaeae;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* a type name */
|
|
21
|
+
.typ {
|
|
22
|
+
color: #8da6ce;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* a literal value */
|
|
26
|
+
.lit {
|
|
27
|
+
color: #fbde2d;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* punctuation */
|
|
31
|
+
.pun {
|
|
32
|
+
color: #ddd;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* lisp open bracket */
|
|
36
|
+
.opn {
|
|
37
|
+
color: #000000;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* lisp close bracket */
|
|
41
|
+
.clo {
|
|
42
|
+
color: #000000;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* a markup tag name */
|
|
46
|
+
.tag {
|
|
47
|
+
color: #8da6ce;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* a markup attribute name */
|
|
51
|
+
.atn {
|
|
52
|
+
color: #fbde2d;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* a markup attribute value */
|
|
56
|
+
.atv {
|
|
57
|
+
color: #ddd;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* a declaration */
|
|
61
|
+
.dec {
|
|
62
|
+
color: #EF5050;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* a variable name */
|
|
66
|
+
.var {
|
|
67
|
+
color: #c82829;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* a function name */
|
|
71
|
+
.fun {
|
|
72
|
+
color: #4271ae;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Specify class=linenums on a pre to get line numbering */
|
|
76
|
+
ol.linenums {
|
|
77
|
+
margin-top: 0;
|
|
78
|
+
margin-bottom: 0;
|
|
79
|
+
}
|
package/g-read.mjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import wdc from './src/WDataCsv.mjs'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
let fp = './g-test-in.csv'
|
|
5
|
+
wdc.readCsv(fp)
|
|
6
|
+
.then((ltdt) => {
|
|
7
|
+
console.log(ltdt)
|
|
8
|
+
// => [ { NAME: 'Daffy Duck', AGE: '24' }, { NAME: 'Bugs 邦妮', AGE: '22' } ]
|
|
9
|
+
})
|
|
10
|
+
.catch((err) => {
|
|
11
|
+
console.log(err)
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
//node --experimental-modules --es-module-specifier-resolution=node g-read.mjs
|
package/g-test-in.csv
ADDED
package/g-test-out.csv
ADDED
package/g-write.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import wdc from './src/WDataCsv.mjs'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
let ltdt = [{ name: '大福 Duck', value: 2.4 }, { name: 'Bugs 邦妮', value: '2.2' }]
|
|
5
|
+
let fp = './g-test-out.csv'
|
|
6
|
+
wdc.writeCsv(fp, ltdt)
|
|
7
|
+
.then((res) => {
|
|
8
|
+
console.log(res)
|
|
9
|
+
// => finish
|
|
10
|
+
})
|
|
11
|
+
.catch((err) => {
|
|
12
|
+
console.log(err)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
//node --experimental-modules --es-module-specifier-resolution=node g-write.mjs
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "w-data-csv",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "dist/w-data-csv.umd.js",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"csv-parser": "^3.0.0",
|
|
7
|
+
"lodash": "^4.17.21",
|
|
8
|
+
"strip-bom-stream": "^5.0.0",
|
|
9
|
+
"wsemi": "^1.6.60"
|
|
10
|
+
},
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"w-package-tools": "^1.0.65"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"test": "mocha --parallel --timeout 60000 --experimental-modules --es-module-specifier-resolution=node",
|
|
16
|
+
"deploy": "gh-pages -d docs"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/yuda-lyu/w-data-csv.git"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"package",
|
|
24
|
+
"tool",
|
|
25
|
+
"csv",
|
|
26
|
+
"nodejs"
|
|
27
|
+
],
|
|
28
|
+
"author": "yuda-lyu(semisphere)",
|
|
29
|
+
"license": "MIT"
|
|
30
|
+
}
|
package/src/WDataCsv.mjs
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import csvParse from 'csv-parser'
|
|
3
|
+
import stripBom from 'strip-bom-stream'
|
|
4
|
+
import get from 'lodash/get'
|
|
5
|
+
import genPm from 'wsemi/src/genPm.mjs'
|
|
6
|
+
import ltdtkeysheads2mat from 'wsemi/src/ltdtkeysheads2mat.mjs'
|
|
7
|
+
import getCsvStrFromData from 'wsemi/src/getCsvStrFromData.mjs'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 讀取CSV檔,自動清除BOM
|
|
12
|
+
*
|
|
13
|
+
* @param {String} fp 輸入檔案位置字串
|
|
14
|
+
* @return {Promise} 回傳Promise,resolve回傳ltdt(各數據列為物件陣列),reject回傳錯誤訊息
|
|
15
|
+
* @example
|
|
16
|
+
*
|
|
17
|
+
* import wdc from './src/WDataCsv.mjs'
|
|
18
|
+
*
|
|
19
|
+
* let fp = './g-test-in.csv'
|
|
20
|
+
* wdc.readCsv(fp)
|
|
21
|
+
* .then((ltdt) => {
|
|
22
|
+
* console.log(ltdt)
|
|
23
|
+
* // => [ { NAME: 'Daffy Duck', AGE: '24' }, { NAME: 'Bugs 邦妮', AGE: '22' } ]
|
|
24
|
+
* })
|
|
25
|
+
* .catch((err) => {
|
|
26
|
+
* console.log(err)
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
*/
|
|
30
|
+
async function readCsv(fp) {
|
|
31
|
+
let res = []
|
|
32
|
+
let pm = genPm()
|
|
33
|
+
fs.createReadStream(fp)
|
|
34
|
+
.pipe(stripBom())
|
|
35
|
+
.pipe(csvParse())
|
|
36
|
+
.on('data', (data) => {
|
|
37
|
+
// console.log('data', data)
|
|
38
|
+
res.push(data)
|
|
39
|
+
})
|
|
40
|
+
.on('end', () => {
|
|
41
|
+
pm.resolve(res)
|
|
42
|
+
})
|
|
43
|
+
.on('error', (err) => {
|
|
44
|
+
pm.reject(err)
|
|
45
|
+
})
|
|
46
|
+
return pm
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 輸出數據至CSV檔案
|
|
52
|
+
*
|
|
53
|
+
* @param {String} fp 輸入檔案位置字串
|
|
54
|
+
* @param {Array} data 輸入數據陣列,為mat或ltdt格式
|
|
55
|
+
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
56
|
+
* @param {String} [opt.mode='ltdt'] 輸入數據格式字串,可選ltdt或mat,預設ltdt
|
|
57
|
+
* @param {Array} [opt.keys=[]] 輸入指定欲輸出鍵值陣列,預設[]
|
|
58
|
+
* @param {Object} [opt.kphead={}] 輸入指定鍵值轉換物件,預設{}
|
|
59
|
+
* @return {Promise} 回傳Promise,resolve回傳成功訊息,reject回傳錯誤訊息
|
|
60
|
+
* @example
|
|
61
|
+
*
|
|
62
|
+
* import wdc from './src/WDataCsv.mjs'
|
|
63
|
+
*
|
|
64
|
+
* let ltdt = [{ name: '大福 Duck', value: 2.4 }, { name: 'Bugs 邦妮', value: '2.2' }]
|
|
65
|
+
* let fp = './g-test-out.csv'
|
|
66
|
+
* wdc.writeCsv(fp, ltdt)
|
|
67
|
+
* .then((res) => {
|
|
68
|
+
* console.log(res)
|
|
69
|
+
* // => finish
|
|
70
|
+
* })
|
|
71
|
+
* .catch((err) => {
|
|
72
|
+
* console.log(err)
|
|
73
|
+
* })
|
|
74
|
+
*
|
|
75
|
+
*/
|
|
76
|
+
async function writeCsv(fp, data, opt = {}) {
|
|
77
|
+
let err = null
|
|
78
|
+
let mat
|
|
79
|
+
let c = ''
|
|
80
|
+
|
|
81
|
+
//mode
|
|
82
|
+
let mode = get(opt, 'mode')
|
|
83
|
+
if (mode !== 'ltdt' && mode !== 'mat') {
|
|
84
|
+
mode = 'ltdt'
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (mode === 'mat') {
|
|
88
|
+
|
|
89
|
+
//save
|
|
90
|
+
mat = data
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
else if (mode === 'ltdt') {
|
|
94
|
+
try {
|
|
95
|
+
|
|
96
|
+
//save
|
|
97
|
+
let ltdt = data
|
|
98
|
+
|
|
99
|
+
//keys
|
|
100
|
+
let keys = get(opt, 'keys')
|
|
101
|
+
|
|
102
|
+
//kphead
|
|
103
|
+
let kphead = get(opt, 'kphead')
|
|
104
|
+
|
|
105
|
+
//ltdtkeysheads2mat
|
|
106
|
+
mat = ltdtkeysheads2mat(ltdt, keys, kphead)
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
err = e.toString()
|
|
111
|
+
return Promise.reject(err)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//getCsvStrFromData
|
|
116
|
+
try {
|
|
117
|
+
c = getCsvStrFromData(mat)
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
err = e.toString()
|
|
121
|
+
return Promise.reject(err)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
//writeFileSync
|
|
125
|
+
try {
|
|
126
|
+
fs.writeFileSync(fp, c, 'utf8')
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
err = e.toString()
|
|
130
|
+
return Promise.reject(err)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return 'finish'
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 讀寫CSV檔
|
|
139
|
+
*
|
|
140
|
+
* @return {Object} 回傳物件,其內有readCsv與writeCsv函式
|
|
141
|
+
* @example
|
|
142
|
+
*
|
|
143
|
+
* import wdc from './src/WDataCsv.mjs'
|
|
144
|
+
*
|
|
145
|
+
* let fpIn = './g-test-in.csv'
|
|
146
|
+
* wdc.readCsv(fpIn)
|
|
147
|
+
* .then((ltdtIn) => {
|
|
148
|
+
* console.log(ltdtIn)
|
|
149
|
+
* // => [ { NAME: 'Daffy Duck', AGE: '24' }, { NAME: 'Bugs 邦妮', AGE: '22' } ]
|
|
150
|
+
* })
|
|
151
|
+
* .catch((err) => {
|
|
152
|
+
* console.log(err)
|
|
153
|
+
* })
|
|
154
|
+
*
|
|
155
|
+
* let ltdtOut = [{ name: '大福 Duck', value: 2.4 }, { name: 'Bugs 邦妮', value: '2.2' }]
|
|
156
|
+
* let fpOut = './g-test-out.csv'
|
|
157
|
+
* wdc.writeCsv(fpOut, ltdtOut)
|
|
158
|
+
* .then((res) => {
|
|
159
|
+
* console.log(res)
|
|
160
|
+
* // => finish
|
|
161
|
+
* })
|
|
162
|
+
* .catch((err) => {
|
|
163
|
+
* console.log(err)
|
|
164
|
+
* })
|
|
165
|
+
*
|
|
166
|
+
*/
|
|
167
|
+
let WDataCsv = {
|
|
168
|
+
readCsv,
|
|
169
|
+
writeCsv,
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
export default WDataCsv
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import WDataCsv from '../src/WDataCsv.mjs'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
describe(`PCA`, function() {
|
|
6
|
+
|
|
7
|
+
let mat = [
|
|
8
|
+
[40, 50, 60],
|
|
9
|
+
[50, 70, 60],
|
|
10
|
+
[80, 70, 90],
|
|
11
|
+
[50, 60, 80]
|
|
12
|
+
]
|
|
13
|
+
let clmat = [
|
|
14
|
+
[36.76572825085965, 50.81184119955175, 61.992939427698765],
|
|
15
|
+
[50.520478881706346, 69.86935352609807, 59.679283942385844],
|
|
16
|
+
[77.39502404588043, 70.65388036857387, 91.60517102143689],
|
|
17
|
+
[55.318768821553576, 58.66492490577632, 76.7226056084785]
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
it(`should return '${JSON.stringify(clmat)}' when input ${JSON.stringify(mat)}, { nCompNIPALS: 2 }`, async function() {
|
|
21
|
+
let r = await WDataCsv.PCA(mat, { nCompNIPALS: 2 })
|
|
22
|
+
assert.strict.deepStrictEqual(r, clmat)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it(`should return 'Error: data is not eff. array' when input 123`, async function() {
|
|
26
|
+
let r = ''
|
|
27
|
+
await WDataCsv.PCA(123)
|
|
28
|
+
.catch((err) => {
|
|
29
|
+
r = err.toString()
|
|
30
|
+
})
|
|
31
|
+
let rr = 'Error: data is not eff. array'
|
|
32
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it(`should return 'Error: data is not eff. array' when input 123.456`, async function() {
|
|
36
|
+
let r = ''
|
|
37
|
+
await WDataCsv.PCA(123.456)
|
|
38
|
+
.catch((err) => {
|
|
39
|
+
r = err.toString()
|
|
40
|
+
})
|
|
41
|
+
let rr = 'Error: data is not eff. array'
|
|
42
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it(`should return 'Error: data is not eff. array' when input '123'`, async function() {
|
|
46
|
+
let r = ''
|
|
47
|
+
await WDataCsv.PCA('123')
|
|
48
|
+
.catch((err) => {
|
|
49
|
+
r = err.toString()
|
|
50
|
+
})
|
|
51
|
+
let rr = 'Error: data is not eff. array'
|
|
52
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it(`should return 'Error: data is not eff. array' when input '123.456'`, async function() {
|
|
56
|
+
let r = ''
|
|
57
|
+
await WDataCsv.PCA('123.456')
|
|
58
|
+
.catch((err) => {
|
|
59
|
+
r = err.toString()
|
|
60
|
+
})
|
|
61
|
+
let rr = 'Error: data is not eff. array'
|
|
62
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it(`should return 'Error: data is not eff. array' when input true`, async function() {
|
|
66
|
+
let r = ''
|
|
67
|
+
await WDataCsv.PCA(true)
|
|
68
|
+
.catch((err) => {
|
|
69
|
+
r = err.toString()
|
|
70
|
+
})
|
|
71
|
+
let rr = 'Error: data is not eff. array'
|
|
72
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it(`should return 'Error: data is not eff. array' when input ''`, async function() {
|
|
76
|
+
let r = ''
|
|
77
|
+
await WDataCsv.PCA('')
|
|
78
|
+
.catch((err) => {
|
|
79
|
+
r = err.toString()
|
|
80
|
+
})
|
|
81
|
+
let rr = 'Error: data is not eff. array'
|
|
82
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it(`should return 'Error: data is not eff. array' when input []`, async function() {
|
|
86
|
+
let r = ''
|
|
87
|
+
await WDataCsv.PCA([])
|
|
88
|
+
.catch((err) => {
|
|
89
|
+
r = err.toString()
|
|
90
|
+
})
|
|
91
|
+
let rr = 'Error: data is not eff. array'
|
|
92
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it(`should return 'Error: data is not eff. array' when input {}`, async function() {
|
|
96
|
+
let r = ''
|
|
97
|
+
await WDataCsv.PCA({})
|
|
98
|
+
.catch((err) => {
|
|
99
|
+
r = err.toString()
|
|
100
|
+
})
|
|
101
|
+
let rr = 'Error: data is not eff. array'
|
|
102
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
it(`should return 'Error: data is not eff. array' when input null`, async function() {
|
|
106
|
+
let r = ''
|
|
107
|
+
await WDataCsv.PCA(null)
|
|
108
|
+
.catch((err) => {
|
|
109
|
+
r = err.toString()
|
|
110
|
+
})
|
|
111
|
+
let rr = 'Error: data is not eff. array'
|
|
112
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it(`should return 'Error: data is not eff. array' when input undefined`, async function() {
|
|
116
|
+
let r = ''
|
|
117
|
+
await WDataCsv.PCA(undefined)
|
|
118
|
+
.catch((err) => {
|
|
119
|
+
r = err.toString()
|
|
120
|
+
})
|
|
121
|
+
let rr = 'Error: data is not eff. array'
|
|
122
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
})
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import WDataCsv from '../src/WDataCsv.mjs'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
describe(`cluster`, function() {
|
|
6
|
+
|
|
7
|
+
let mode = 'k-medoids'
|
|
8
|
+
|
|
9
|
+
let mat = [
|
|
10
|
+
[40, 50, 60],
|
|
11
|
+
[50, 70, 60],
|
|
12
|
+
[80, 70, 90],
|
|
13
|
+
[50, 60, 80]
|
|
14
|
+
]
|
|
15
|
+
let clmat = { 'keys': null, 'ginds': [[2], [0, 1, 3]], 'gltdt': [[[80, 70, 90]], [[40, 50, 60], [50, 70, 60], [50, 60, 80]]], 'gmat': [[[77.39502404588043, 70.65388036857387, 91.60517102143689]], [[36.76572825085965, 50.81184119955175, 61.992939427698765], [50.520478881706346, 69.86935352609807, 59.679283942385844], [55.318768821553576, 58.66492490577632, 76.7226056084785]]] }
|
|
16
|
+
|
|
17
|
+
it(`should return '${JSON.stringify(clmat)}' when input ${JSON.stringify(mat)}, { mode, kNumber: 2, nCompNIPALS: 2 }`, async function() {
|
|
18
|
+
let r = await WDataCsv.cluster(mat, { mode, kNumber: 2, nCompNIPALS: 2 })
|
|
19
|
+
assert.strict.deepStrictEqual(r, clmat)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
let ltdt = [
|
|
23
|
+
{ name: 'Cameron', a: 40, b: 50, c: 60 },
|
|
24
|
+
{ name: 'Buckley', a: 50, b: 70, c: 60 },
|
|
25
|
+
{ name: 'Paul', a: 80, b: 70, c: 90 },
|
|
26
|
+
{ name: 'Fawcett', a: 50, b: 60, c: 80 },
|
|
27
|
+
]
|
|
28
|
+
let clltdt = { 'keys': ['a', 'b', 'c'], 'ginds': [[2], [0, 1, 3]], 'gltdt': [[{ 'name': 'Paul', 'a': 80, 'b': 70, 'c': 90 }], [{ 'name': 'Cameron', 'a': 40, 'b': 50, 'c': 60 }, { 'name': 'Buckley', 'a': 50, 'b': 70, 'c': 60 }, { 'name': 'Fawcett', 'a': 50, 'b': 60, 'c': 80 }]], 'gmat': [[[77.39502404588043, 70.65388036857387, 91.60517102143689]], [[36.76572825085965, 50.81184119955175, 61.992939427698765], [50.520478881706346, 69.86935352609807, 59.679283942385844], [55.318768821553576, 58.66492490577632, 76.7226056084785]]] }
|
|
29
|
+
|
|
30
|
+
it(`should return '${JSON.stringify(clltdt)}' when input ${JSON.stringify(ltdt)}, { mode, kNumber: 2, nCompNIPALS: 2 }`, async function() {
|
|
31
|
+
let r = await WDataCsv.cluster(ltdt, { mode, kNumber: 2, nCompNIPALS: 2 })
|
|
32
|
+
assert.strict.deepStrictEqual(r, clltdt)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it(`should return 'Error: data is not eff. array' when input 123`, async function() {
|
|
36
|
+
let r = ''
|
|
37
|
+
await WDataCsv.cluster(123)
|
|
38
|
+
.catch((err) => {
|
|
39
|
+
r = err.toString()
|
|
40
|
+
})
|
|
41
|
+
let rr = 'Error: data is not eff. array'
|
|
42
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it(`should return 'Error: data is not eff. array' when input 123.456`, async function() {
|
|
46
|
+
let r = ''
|
|
47
|
+
await WDataCsv.cluster(123.456)
|
|
48
|
+
.catch((err) => {
|
|
49
|
+
r = err.toString()
|
|
50
|
+
})
|
|
51
|
+
let rr = 'Error: data is not eff. array'
|
|
52
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it(`should return 'Error: data is not eff. array' when input '123'`, async function() {
|
|
56
|
+
let r = ''
|
|
57
|
+
await WDataCsv.cluster('123')
|
|
58
|
+
.catch((err) => {
|
|
59
|
+
r = err.toString()
|
|
60
|
+
})
|
|
61
|
+
let rr = 'Error: data is not eff. array'
|
|
62
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it(`should return 'Error: data is not eff. array' when input '123.456'`, async function() {
|
|
66
|
+
let r = ''
|
|
67
|
+
await WDataCsv.cluster('123.456')
|
|
68
|
+
.catch((err) => {
|
|
69
|
+
r = err.toString()
|
|
70
|
+
})
|
|
71
|
+
let rr = 'Error: data is not eff. array'
|
|
72
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it(`should return 'Error: data is not eff. array' when input true`, async function() {
|
|
76
|
+
let r = ''
|
|
77
|
+
await WDataCsv.cluster(true)
|
|
78
|
+
.catch((err) => {
|
|
79
|
+
r = err.toString()
|
|
80
|
+
})
|
|
81
|
+
let rr = 'Error: data is not eff. array'
|
|
82
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it(`should return 'Error: data is not eff. array' when input ''`, async function() {
|
|
86
|
+
let r = ''
|
|
87
|
+
await WDataCsv.cluster('')
|
|
88
|
+
.catch((err) => {
|
|
89
|
+
r = err.toString()
|
|
90
|
+
})
|
|
91
|
+
let rr = 'Error: data is not eff. array'
|
|
92
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it(`should return 'Error: data is not eff. array' when input []`, async function() {
|
|
96
|
+
let r = ''
|
|
97
|
+
await WDataCsv.cluster([])
|
|
98
|
+
.catch((err) => {
|
|
99
|
+
r = err.toString()
|
|
100
|
+
})
|
|
101
|
+
let rr = 'Error: data is not eff. array'
|
|
102
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
it(`should return 'Error: data is not eff. array' when input {}`, async function() {
|
|
106
|
+
let r = ''
|
|
107
|
+
await WDataCsv.cluster({})
|
|
108
|
+
.catch((err) => {
|
|
109
|
+
r = err.toString()
|
|
110
|
+
})
|
|
111
|
+
let rr = 'Error: data is not eff. array'
|
|
112
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it(`should return 'Error: data is not eff. array' when input null`, async function() {
|
|
116
|
+
let r = ''
|
|
117
|
+
await WDataCsv.cluster(null)
|
|
118
|
+
.catch((err) => {
|
|
119
|
+
r = err.toString()
|
|
120
|
+
})
|
|
121
|
+
let rr = 'Error: data is not eff. array'
|
|
122
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
it(`should return 'Error: data is not eff. array' when input undefined`, async function() {
|
|
126
|
+
let r = ''
|
|
127
|
+
await WDataCsv.cluster(undefined)
|
|
128
|
+
.catch((err) => {
|
|
129
|
+
r = err.toString()
|
|
130
|
+
})
|
|
131
|
+
let rr = 'Error: data is not eff. array'
|
|
132
|
+
assert.strict.deepStrictEqual(r, rr)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
})
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// import path from 'path'
|
|
2
|
+
import rollupFiles from 'w-package-tools/src/rollupFiles.mjs'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
let fdSrc = './src'
|
|
6
|
+
let fdTar = './dist'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
async function rp() {
|
|
10
|
+
|
|
11
|
+
await rollupFiles({ //rollupFiles預設會clean folder
|
|
12
|
+
fns: 'WDataCsv.mjs',
|
|
13
|
+
fdSrc,
|
|
14
|
+
fdTar,
|
|
15
|
+
nameDistType: 'kebabCase',
|
|
16
|
+
// bNodePolyfill: true,
|
|
17
|
+
// bMinify: false,
|
|
18
|
+
globals: {
|
|
19
|
+
'fs': 'fs',
|
|
20
|
+
'csv-parser': 'csv-parser',
|
|
21
|
+
'strip-bom-stream': 'strip-bom-stream',
|
|
22
|
+
},
|
|
23
|
+
external: [
|
|
24
|
+
'fs',
|
|
25
|
+
'csv-parser',
|
|
26
|
+
'strip-bom-stream',
|
|
27
|
+
],
|
|
28
|
+
})
|
|
29
|
+
.catch((err) => {
|
|
30
|
+
console.log(err)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
rp()
|
|
35
|
+
.catch((err) => {
|
|
36
|
+
console.log(err)
|
|
37
|
+
})
|
|
38
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import _ from 'lodash'
|
|
3
|
+
import getFiles from 'w-package-tools/src/getFiles.mjs'
|
|
4
|
+
import getPks from 'w-package-tools/src/getPks.mjs'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
let fdSrc = './examples/'
|
|
8
|
+
let fdTar = './docs/examples/'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
function main() {
|
|
12
|
+
//把example裡面cdn更換, 再複製到docs的example內, 作為日後發佈為靜態網站
|
|
13
|
+
|
|
14
|
+
//pks
|
|
15
|
+
let pks = getPks()
|
|
16
|
+
|
|
17
|
+
//url
|
|
18
|
+
let url = `https://cdn.jsdelivr.net/npm/w-data-csv@${pks.version}/dist/w-data-csv.umd.js`
|
|
19
|
+
|
|
20
|
+
//mkdirSync
|
|
21
|
+
if (!fs.existsSync(fdTar)) {
|
|
22
|
+
fs.mkdirSync(fdTar)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//getFiles
|
|
26
|
+
let ltfs = getFiles(fdSrc)
|
|
27
|
+
|
|
28
|
+
_.each(ltfs, function(v) {
|
|
29
|
+
|
|
30
|
+
//fn
|
|
31
|
+
let fn = fdSrc + v
|
|
32
|
+
|
|
33
|
+
//c
|
|
34
|
+
let c = fs.readFileSync(fn, 'utf8')
|
|
35
|
+
|
|
36
|
+
//replace
|
|
37
|
+
let r
|
|
38
|
+
r = `../dist/w-data-csv.umd.js`
|
|
39
|
+
c = c.replace(r, url)
|
|
40
|
+
|
|
41
|
+
//write
|
|
42
|
+
//console.log(c)
|
|
43
|
+
fs.writeFileSync(fdTar + v, c, 'utf8')
|
|
44
|
+
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
// main()
|