Skip to content

Instantly share code, notes, and snippets.

@worksofliam
Created December 24, 2021 01:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save worksofliam/d2b522eca37ec6d88dfe4caba3a41745 to your computer and use it in GitHub Desktop.
Save worksofliam/d2b522eca37ec6d88dfe4caba3a41745 to your computer and use it in GitHub Desktop.
/usr/bin/db2 parser
if (output.code == null || output.code === 0) {
let gotHeaders = false;
let figuredLengths = false;
let data = output.stdout.split(`\n`);
/** @type {{name: string, from: number, length: number}[]} */
let headers;
let rows = [];
data.forEach((line, index) => {
if (line.trim().length === 0 || index === data.length - 1) return;
if (gotHeaders === false) {
headers = line.split(` `).filter((x) => x.length > 0).map((x) => {
return {
name: x,
from: 0,
length: 0,
};
});
gotHeaders = true;
} else
if (figuredLengths === false) {
let base = 0;
line.split(` `).forEach((x, i) => {
headers[i].from = base;
headers[i].length = x.length;
base += x.length + 1;
});
figuredLengths = true;
} else {
let row = {};
headers.forEach((header) => {
/** @type {string|number} */
let value = line.substring(header.from, header.from + header.length).trimEnd();
// is value a number?
if (value.startsWith(` `)) {
const asNumber = Number(value.trim());
if (!isNaN(asNumber)) {
value = asNumber;
}
}
row[header.name] = value;
});
rows.push(row);
}
});
return rows;
} else {
const errorLines = output.stdout.split(`\n`);
throw new Error(`${errorLines[3]} (${errorLines[1].trim()})`);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment