1 | 'use strict'
|
2 |
|
3 | const { createReadStream } = require('fs')
|
4 | const readline = require('readline')
|
5 |
|
6 | const unescape = value => {
|
7 | if (value.startsWith('"') && value.endsWith('"')) {
|
8 | return JSON.parse(value)
|
9 | }
|
10 | return value
|
11 | }
|
12 |
|
13 | async function * buildCsvReader (fileName) {
|
14 | const fileStream = createReadStream(fileName)
|
15 | const rl = readline.createInterface({
|
16 | input: fileStream,
|
17 | crlfDelay: Infinity
|
18 | })
|
19 | let headers
|
20 | for await (const line of rl) {
|
21 | const fields = line.split('\t')
|
22 | if (headers === undefined) {
|
23 | headers = fields
|
24 | continue
|
25 | }
|
26 | const record = {}
|
27 | headers.forEach((field, index) => {
|
28 | record[field] = unescape(fields[index])
|
29 | })
|
30 | yield record
|
31 | }
|
32 | }
|
33 |
|
34 | module.exports = {
|
35 | buildCsvReader
|
36 | }
|