Я транслирую CSV-файл с помощью работника, но получаю это предупреждение: «Дубликаты заголовков найдены и переименованы»., даже если в CSV-файле нет повторяющихся ключей заголовков.
CSV:
CHIAVE|COD_DITTA|COD_ARTICOLO|COD_DEPOSITO|DESC_DEPOSITO|GIACENZA|DISPONIBILITA|UM1|DAT_ULT_MOD
4CED3697-STEBE-4254-9DB9-8D233096D796#DEXXXX0036#00|1|DEXXXX0036|00|Deposito 00|0,000|0,000|CT|01011900000000
Если я удалю строки и оставлю только заголовок, я не получу предупреждения, но анализатор должен просматривать только первую строку файла, поэтому я не понимаю, почему он говорит, что есть повторяющиеся заголовки. Также он указывает «0,000», которое находится в строках, но нет разделителя, который мог бы испортить синтаксический анализ. И все равно это подряд, а не заголовок.
мой скрипт:
export async function importToDatabase(tableName, databaseId) {
console.log(`...Importing: ${tableName}`);
const connection = await pool.getConnection();
try {
const filePath = path.resolve(`data/${databaseId}/dat_files/io_${tableName}.dat`);
// Fetch table columns
const [columnsResult] = await connection.query(
`SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ?
AND TABLE_SCHEMA = DATABASE()`,
[tableName],
);
const tableColumns = columnsResult.map((r) => r.COLUMN_NAME);
if (!tableColumns.length) throw new Error('No columns found in database table');
const validColumns = tableColumns.map((c) => c.trim().toLowerCase());
// HARD SYNC: remove existing rows for this database
await connection.beginTransaction();
await connection.query(`DELETE FROM ${tableName} WHERE database_id = ?`, [databaseId]);
await connection.commit();
// Prepare for batch insert
const BATCH_SIZE = 500;
let batch = [];
let totalRows = 0;
await connection.beginTransaction();
const stream = fs.createReadStream(filePath, { encoding: 'utf8' });
await new Promise((resolve, reject) => {
Papa.parse(stream, {
header: true,
delimiter: '|',
quoteChar: '',
skipEmptyLines: true,
worker: true,
transform: (value) => value?.trim(),
step: async (results, parser) => {
const row = results.data;
// Normalize keys
const normalizedRow = {};
for (const key in row) normalizedRow[key.trim().toLowerCase()] = row[key];
normalizedRow['database_id'] = databaseId;
// Filter only valid columns
const filteredRow = {};
for (const col of validColumns) filteredRow[col] = normalizedRow[col] ?? null;
// Skip rows missing mandatory column
if (!filteredRow.chiave) return;
batch.push(filteredRow);
if (batch.length >= BATCH_SIZE) {
parser.pause();
const placeholders = batch
.map(() => `(${validColumns.map(() => '?').join(',')})`)
.join(',');
const values = batch.flatMap((r) =>
validColumns.map((col) => r[col]?.toString().trim() ?? null),
);
try {
await connection.query(
`INSERT INTO ${tableName} (${validColumns.join(',')}) VALUES ${placeholders}`,
values,
);
totalRows += batch.length;
batch = [];
parser.resume();
} catch (err) {
parser.abort();
reject(err);
}
}
},
complete: async (results) => {
try {
// Insert remaining batch
if (batch.length) {
const placeholders = batch
.map(() => `(${validColumns.map(() => '?').join(',')})`)
.join(',');
const values = batch.flatMap((r) =>
validColumns.map((col) => r[col]?.toString().trim() ?? null),
);
await connection.query(
`INSERT INTO ${tableName} (${validColumns.join(',')}) VALUES ${placeholders}`,
values,
);
totalRows += batch.length;
}
await connection.commit();
// Only log real duplicates
if (results.meta?.renamedHeaders?.length) {
console.warn(`Actual duplicate headers renamed:`, results.meta.renamedHeaders);
}
console.log(`SUCCESS: io_${tableName}.dat (${totalRows} rows)`);
resolve();
} catch (err) {
await connection.rollback();
reject(err);
}
},
error: async (err) => {
await connection.rollback();
reject(err);
},
});
});
} catch (error) {
await connection.rollback();
if (error.code === 'ENOENT') {
console.error(`ERROR: io_${tableName}.dat not found`);
} else {
console.error(`ERROR: io_${tableName}.dat`, error);
}
} finally {
connection.release();
}
}
В журнале консоли:
...Importing: art_stock
Duplicate headers found and renamed.
Duplicate header found: "0,000"
Подробнее здесь: https://stackoverflow.com/questions/798 ... te-headers