json lines reader, writer

This commit is contained in:
Jan Prochazka
2020-06-11 20:52:57 +02:00
parent 41ee6e9b91
commit b520501d1f
7 changed files with 105 additions and 29 deletions

View File

@@ -7,6 +7,8 @@ const copyStream = require('./copyStream');
const fakeObjectReader = require('./fakeObjectReader');
const consoleObjectWriter = require('./consoleObjectWriter');
const excelSheetReader = require('./excelSheetReader');
const jsonLinesWriter = require('./jsonLinesWriter');
const jsonLinesReader = require('./jsonLinesReader');
module.exports = {
queryReader,
@@ -16,6 +18,8 @@ module.exports = {
tableWriter,
copyStream,
excelSheetReader,
jsonLinesWriter,
jsonLinesReader,
fakeObjectReader,
consoleObjectWriter,
};

View File

@@ -0,0 +1,32 @@
const fs = require('fs');
const stream = require('stream');
const byline = require('byline');
class ParseStream extends stream.Transform {
constructor({ header }) {
super({ objectMode: true });
this.header = header;
this.wasHeader = false;
}
_transform(chunk, encoding, done) {
const obj = JSON.parse(chunk);
if (!this.wasHeader) {
if (!this.header) this.push({ columns: Object.keys(obj).map((columnName) => ({ columnName })) });
this.wasHeader = true;
}
this.push(obj);
done();
}
}
async function jsonLinesReader({ fileName, encoding = 'utf-8', header = true }) {
console.log(`Reading file ${fileName}`);
const fileStream = fs.createReadStream(fileName, encoding);
const liner = byline(fileStream);
const parser = new ParseStream({ header });
liner.pipe(parser);
return parser;
}
module.exports = jsonLinesReader;

View File

@@ -0,0 +1,30 @@
const fs = require('fs');
const stream = require('stream');
class StringifyStream extends stream.Transform {
constructor({ header }) {
super({ objectMode: true });
this.header = header;
this.wasHeader = false;
}
_transform(chunk, encoding, done) {
if (!this.wasHeader) {
if (this.header) this.push(JSON.stringify(chunk) + '\n');
this.wasHeader = true;
} else {
this.push(JSON.stringify(chunk) + '\n');
}
done();
}
}
async function jsonLinesWriter({ fileName, encoding = 'utf-8', header = true }) {
console.log(`Writing file ${fileName}`);
const stringify = new StringifyStream({ header });
const fileStream = fs.createWriteStream(fileName, encoding);
stringify.pipe(fileStream);
stringify['finisher'] = fileStream;
return stringify;
}
module.exports = jsonLinesWriter;