feat: find incomplete csv records

This commit is contained in:
Chesterkxng
2025-04-08 18:02:19 +02:00
parent 83d2a86bf6
commit 4db7c1bf33
5 changed files with 306 additions and 1 deletions

View File

@@ -0,0 +1,80 @@
import { InitialValuesType } from './types';
import { splitCsv } from '@utils/csv';
function generateMessage(
row: string[],
lineIndex: number,
maxLength: number,
emptyLines: boolean,
emptyValues: boolean
) {
const lineNumber = lineIndex + 1;
// check if empty lines are allowed
if (!emptyLines && row.length === 1 && row[0] === '')
return { title: 'Missing Line', message: `Line ${lineNumber} is empty.` };
// if row legth is less than maxLength it means that there are missing columns
if (row.length < maxLength)
return {
title: `Found missing column(s) on line ${lineNumber}`,
message: `Line ${lineNumber} has ${
maxLength - row.length
} missing column(s).`
};
// if row length is equal to maxLength we should check if there are empty values
if (row.length == maxLength && emptyValues) {
let missingValues = false;
let message = `Empty values on line ${lineNumber}: `;
row.forEach((cell, index) => {
if (cell.trim() === '') {
missingValues = true;
message += `column ${index + 1}, `;
}
});
if (missingValues)
return {
title: `Found missing values on line ${lineNumber}`,
message: message.slice(0, -2) + '.'
};
}
return null;
}
export function findIncompleteCsvRecords(
input: string,
options: InitialValuesType
): string {
if (!input) return '';
if (options.messageLimit && options.messageNumber <= 0)
throw new Error('Message number must be greater than 0');
const rows = splitCsv(
input,
true,
options.commentCharacter,
options.emptyLines,
options.csvSeparator,
options.quoteCharacter
);
const maxLength = Math.max(...rows.map((row) => row.length));
const messages = rows
.map((row, index) =>
generateMessage(
row,
index,
maxLength,
options.emptyLines,
options.emptyValues
)
)
.filter(Boolean)
.map((msg) => `Title: ${msg!.title}\nMessage: ${msg!.message}`);
return messages.length > 0
? options.messageLimit
? messages.slice(0, options.messageNumber).join('\n\n')
: messages.join('\n\n')
: 'The Csv input is complete.';
}