65 lines
2.2 KiB
JavaScript
65 lines
2.2 KiB
JavaScript
import { cleanDoc, normDateStr, toUTCms } from './helpers.mjs';
|
|
|
|
// Parsea una línea (nombres preservados)
|
|
export function parseLine(line) {
|
|
const raw = String(line || '').replace(/\r/g, '').trim();
|
|
if (!raw) return null;
|
|
|
|
// omitir encabezado
|
|
if (/^no[\t ]|^mchn[\t ]|^enno[\t ]|^name[\t ]|^datetime[\t ]/i.test(raw)) return null;
|
|
|
|
let parts = raw.split(/\t+/);
|
|
|
|
// Si no alcanzan 7 campos, intentar fallback con dos o más espacios
|
|
if (parts.length < 7) {
|
|
const dtMatch = raw.match(/(\d{2,4}[\/-]\d{1,2}[\/-]\d{1,2})\s+(\d{1,2}:\d{2}:\d{2})$/);
|
|
if (dtMatch) {
|
|
const head = raw.slice(0, dtMatch.index).trim();
|
|
const headParts = head.split(/\t+|\s{2,}/).filter(Boolean);
|
|
parts = [...headParts, dtMatch[1], dtMatch[2]];
|
|
} else {
|
|
parts = raw.split(/\s{2,}/).filter(Boolean);
|
|
}
|
|
}
|
|
if (parts.length < 7) return null;
|
|
|
|
// 0:No, 1:Mchn, 2:EnNo(doc), 3:Name, 4:Mode, 5:Fecha, 6:Hora
|
|
const DOC_IDX = 2;
|
|
const NAME_IDX = 3;
|
|
const MODE_IDX = 4;
|
|
|
|
const doc = cleanDoc(parts[DOC_IDX]);
|
|
const name = String(parts[NAME_IDX] || '').trim();
|
|
const mode = String(parts[MODE_IDX] || '').trim();
|
|
|
|
let dateStr = String(parts[5] || '').trim();
|
|
let timeStr = String(parts[6] || '').trim();
|
|
|
|
// Caso: 7 columnas y última es "DateTime"
|
|
const last = parts[parts.length - 1];
|
|
const dtBoth = /(\d{2,4}[\/-]\d{1,2}[\/-]\d{1,2})\s+(\d{1,2}:\d{2}:\d{2})/.exec(last);
|
|
if (dtBoth) {
|
|
dateStr = dtBoth[1];
|
|
timeStr = dtBoth[2];
|
|
} else if (!timeStr && /\d{1,2}:\d{2}:\d{2}/.test(dateStr)) {
|
|
const m = dateStr.match(/^(.+?)\s+(\d{1,2}:\d{2}:\d{2})$/);
|
|
if (m) { dateStr = m[1]; timeStr = m[2]; }
|
|
}
|
|
|
|
const iso = normDateStr(dateStr); // YY/MM/DD o YYYY/MM/DD -> YYYY-MM-DD
|
|
if (!iso || !/^\d{1,2}:\d{2}:\d{2}$/.test(timeStr)) return null;
|
|
|
|
const [H, M, S] = timeStr.split(':').map(n => parseInt(n, 10));
|
|
// mantener construcción local solo por paridad con el snippet original
|
|
// eslint-disable-next-line no-unused-vars
|
|
const dt = new Date(`${iso}T${String(H).padStart(2,'0')}:${String(M).padStart(2,'0')}:${String(S).padStart(2,'0')}`);
|
|
|
|
return {
|
|
doc, name,
|
|
isoDate: iso,
|
|
time: timeStr,
|
|
dt_ms: toUTCms(iso, timeStr), // ⬅️ clave
|
|
mode
|
|
};
|
|
}
|