Skip to content

Commit

Permalink
Add jsonl support (#1919)
Browse files Browse the repository at this point in the history
  • Loading branch information
kfigiela committed May 23, 2024
1 parent 99c7663 commit b9447ae
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/15utility.js
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,7 @@ utils.autoExtFilename = function (filename, ext, config) {
config = config || {};
if (
typeof filename !== 'string' ||
filename.match(/^[A-z]+:\/\/|\n|\..{2,4}$/) ||
filename.match(/^[A-Z]+:\/\/|\n|\..{2,6}$/i) ||
config.autoExt === 0 ||
config.autoExt === false
) {
Expand Down
39 changes: 38 additions & 1 deletion src/84from.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,47 @@ alasql.from.JSON = function (filename, opts, cb, idx, query) {
if (cb) {
res = cb(res, idx, query);
}
});
}),
err => {
throw new Error(err);
};
return res;
};

const jsonl = ext => {
return function (filename, opts, cb, idx, query) {
let out = [];
filename = alasql.utils.autoExtFilename(filename, ext, opts);
alasql.utils.loadFile(
filename,
!!cb,
function (data) {
data.split(/\r?\n/).forEach((line, ix) => {
const trimmed = line.trim();
if (trimmed !== '') {
// skip empty lines, we do not use filter on an input, as we want to preserve line numbers
try {
out.push(JSON.parse(trimmed));
} catch (e) {
throw new Error(`Could not parse JSON at line ${ix}: ${e.toString()}`);
}
}
});
if (cb) {
res = cb(out, idx, query);
}
},
err => {
throw new Error(err);
}
);
return out;
};
};

alasql.from.JSONL = jsonl('jsonl');
alasql.from.NDJSON = jsonl('ndjson');

alasql.from.TXT = function (filename, opts, cb, idx, query) {
var res;
filename = alasql.utils.autoExtFilename(filename, 'txt', opts);
Expand Down
51 changes: 51 additions & 0 deletions test/test1919.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
if (typeof exports === 'object') {
var assert = require('assert');
var alasql = require('..');
}

/*
Test for issue #1919
*/
describe(`Test 1919 Load data from JSONL file`, function () {
const expectedResult = [
{
a: 'foo',
b: 5,
c: true,
d: null
},
{
a: 'bar',
b: 8,
c: false,
d: null
}
];
it('1. Load JSONL', function (done) {
alasql('SELECT * FROM JSONL("' + __dirname + '/test1919")', [], function (res) {
assert.deepEqual(res, expectedResult);
done();
});
});

it('2. Load NDJSON', function (done) {
alasql('SELECT * FROM NDJSON("' + __dirname + '/test1919")', [], function (res) {
assert.deepEqual(res, expectedResult);
done();
});
});

it('3. Load NDJSON - will accept file with different extension', function (done) {
alasql('SELECT * FROM NDJSON("' + __dirname + '/test1919.jsonl")', [], function (res) {
assert.deepEqual(res, expectedResult);
done();
});
});

it('4. Load JSONL - will accept file with different extension', function (done) {
alasql('SELECT * FROM JSONL("' + __dirname + '/test1919.ndjson")', [], function (res) {
assert.deepEqual(res, expectedResult);
done();
});
});
});
2 changes: 2 additions & 0 deletions test/test1919.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{"a":"foo","b":5.0,"c":true,"d":null}
{"a":"bar","b":8.0,"c":false,"d":null}
2 changes: 2 additions & 0 deletions test/test1919.ndjson
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{"a":"foo","b":5.0,"c":true,"d":null}
{"a":"bar","b":8.0,"c":false,"d":null}

0 comments on commit b9447ae

Please sign in to comment.