-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcsv-to-sqlite.ts
85 lines (65 loc) · 2.15 KB
/
csv-to-sqlite.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import fs from 'fs/promises'
import path from 'path'
import Database from 'better-sqlite3'
import Papa from 'papaparse'
import knex from 'knex'
import {chunk} from 'lodash'
import parserTypescript from "prettier/parser-typescript";
import prettier from "prettier/standalone";
const knexClient = knex({client: 'sqlite', useNullAsDefault: true});
const importFromFile = async (db: Database.Database, data: unknown [], tableName: string) => {
await createTable(db, tableName, Object.keys(data[0]))
for (const lines of chunk(data, 100)) {
const sql = knexClient.insert(lines).into(tableName).toSQL().toNative()
db.prepare(sql.sql).run(sql.bindings)
}
}
const createTable = async(db: Database.Database, tableName: string, columns: string[]) => {
const sql = knexClient.schema.createTable(tableName, table => {
columns.forEach(c => {
table.string(c)
})
}).toSQL()[0]
return db.prepare(sql.sql).run(sql.bindings)
}
const getData = async (filePath: string) => {
return new Promise<Array<unknown>>(async (resolve, reject) => {
try {
const file = await fs.readFile(filePath)
Papa.parse(file.toString(), {
header: true,
complete:function(results) {
resolve(results.data)
}, error: (error) => reject(error)})
} catch (error) {
reject(error)
}
})
}
(async () => {
try {
await fs.rm('data.sqlite3')
} catch (error) {
}
const tableSchemas: string[] = []
const db = new Database('data.sqlite3')
const files =await fs.readdir('data')
for (const file of files) {
console.log(file)
const tableName = file.split('.')[0]
const data = await getData(`data/${file}`)
const columns = Object.keys(data[0])
const schema: Record<string, string> = {}
for (const column of columns) {
schema[column] = column;
}
schema["__tableName"] = tableName;
tableSchemas.push(`export const ${tableName} = ${JSON.stringify(schema)} `);
await importFromFile(db, data, tableName)
}
const data = prettier.format(tableSchemas.join("\r\n\r\n"), {
parser: "typescript",
plugins: [parserTypescript]
});
fs.writeFile("./dbSchema.ts", data)
})()