Files
omni-tools/src/pages/tools/csv/find-incomplete-csv-records/service.ts
2025-04-08 18:02:19 +02:00

81 lines
2.2 KiB
TypeScript

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.';
}