mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-09-19 05:59:34 +02:00
81 lines
2.2 KiB
TypeScript
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.';
|
|
}
|