You could simply pre-process the file to extract the relevant content (e.g. the two lines you're interested, then pass this to csv-parse),
For example:
const parse = require("csv-parse");
const fs = require("fs");
const filePath = "inline-headers.csv";
const csvContent = getRequiredCsvContent(filePath);
function getRequiredCsvContent(filePath) {
// Replace with your actual regex pattern...
let lineMatcher = /header/i;
let fileLines = fs.readFileSync(filePath, "utf8").split("\n");
let requiredLines = fileLines.reduce((contentArray, line, index) => {
if (lineMatcher.test(line) || (contentArray.length === 1)) {
contentArray.push(line);
}
return contentArray;
}, []);
return requiredLines.join("\n");
}
console.log("Extracted csv content:\n", csvContent);
parse(csvContent, {
delimiter: ",",
columns: true
}, (err, records) => {
if (err) {
console.error("An error occurred:", err);
} else {
console.log("Records:", records);
}
});
I'm using a test file like so:
inline-headers.csv
someline01,someline02,someline03
someline11,someline12,someline13
header1,header2,header3
field1,field2,field3
I'm including a more specific answer here that's more tailored to your actual problem:
const parse = require("csv-parse");
const fs = require("fs");
const filePath = "inline-headers.csv";
const csvContent = getRequiredCsvContent(filePath);
function getRequiredCsvContent(filePath) {
const lineMatcher = /^(I|D),DISPATCH,UNIT_SOLUTION/;
let fileLines = fs.readFileSync(filePath, "utf8").split("\n");
let requiredLines = fileLines.reduce((contentArray, line) => {
if (lineMatcher.test(line) || (contentArray.length === 1)) {
contentArray.push(line);
}
return contentArray;
}, []);
return requiredLines.join("\n")
}
console.log("Extracted csv content:\n", csvContent);
parse(csvContent, {
delimiter: ",",
columns: true,
relax_column_count: true
}, (err, records) => {
if (err) {
console.error("Error:", err);
} else {
console.log("Records:", records);
}
});