From a24cb20403e79c5842e93f1dab72594000593b10 Mon Sep 17 00:00:00 2001 From: Nulo Date: Sun, 24 Nov 2024 10:50:50 -0300 Subject: [PATCH] readcsv, duckdb neo --- sepa/bun.lockb | Bin 462408 -> 468592 bytes sepa/importer.js | 451 ++++++++++++++++++++++++++-------------------- sepa/package.json | 2 + 3 files changed, 260 insertions(+), 193 deletions(-) diff --git a/sepa/bun.lockb b/sepa/bun.lockb index c2790269f32436950a73a3a9f4d82eb2370ba94a..7493719a9498a422c4298fc1ef18cdd81bf65636 100755 GIT binary patch delta 96326 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�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 Ii_O{p1vRc;Pyhe` delta 92902 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 diff --git a/sepa/importer.js b/sepa/importer.js index 667fd54..a395499 100644 --- a/sepa/importer.js +++ b/sepa/importer.js @@ -1,45 +1,56 @@ // @ts-check -import * as fs from "fs/promises"; -import Papa from "papaparse"; +import * as fsp from "fs/promises"; +import * as fs from "fs"; +import { CsvParserStream, parse, parseString } from "fast-csv"; import { basename, join, dirname } from "path"; import { $ } from "zx"; import PQueue from "p-queue"; import { Database } from "duckdb-async"; import fg from "fast-glob"; -// import { waddler } from "waddler"; +import { + DuckDBAppender, + DuckDBConnection, + DuckDBInstance, +} from "@duckdb/node-api"; +import Papa from "papaparse"; // TODO: verificar que pasa cuando hay varios datasets del mismo día (como los suele haber cuando actualizan el dataset con nuevos comercios) +const instance = await DuckDBInstance.create("importer.db"); -/** - * @param {string} path - * @returns {Promise} - */ -async function readFile(path) { - // XXX: DORINKA SRL a veces envía archivos con UTF-16. - const buffer = await fs.readFile(path, { encoding: null }); - if (buffer[0] === 0xff && buffer[1] === 0xfe) { - return buffer.toString("utf16le"); - } else { - return buffer.toString("utf8"); - } +const queue = new PQueue({ concurrency: 5 }); + +let hasTars = false; +const files = await fg("**/*.tar.zst", { cwd: process.argv[2] }); +for (const file of files) { + hasTars = true; + const tar = join(process.argv[2], file); + queue.add(() => importDatasetTar(tar)); +} +await queue.onIdle(); + +if (!hasTars) { + await importDump(process.argv[2]); } /** - * @param {Database} db + * @param {DuckDBConnection} connection * @param {number} datasetId * @param {string} dir */ -async function importSucursales(db, datasetId, dir) { - const sucursales = Papa.parse(await readFile(join(dir, "sucursales.csv")), { - header: true, - }); +async function importSucursales(connection, datasetId, dir) { + const stream = await createReadStream(join(dir, "sucursales.csv")); + const appender = await connection.createAppender("main", "sucursales"); - const objs = sucursales.data - .filter((data) => data.id_comercio && data.id_bandera && data.id_sucursal) - .map((data) => { - // Megatone - if ("sucursales_domingohorario_atencion" in data) { + stream + .pipe( + parse({ headers: true, delimiter: "|", ignoreEmpty: true, trim: true }) + ) + .on("data", (data) => { + if (!data.id_comercio || !data.id_bandera || !data.id_sucursal) { + return; + } + if (data.sucursales_domingohorario_atencion) { data.sucursales_domingo_horario_atencion = data.sucursales_domingohorario_atencion; delete data.sucursales_domingohorario_atencion; @@ -47,84 +58,177 @@ async function importSucursales(db, datasetId, dir) { data.sucursales_nombre = data.sucursales_nombre .replaceAll("\t", " ") .trim(); - return { - id_dataset: datasetId, - ...data, - }; + + if (!("sucursales_longitud" in data)) { + console.debug({ data }); + throw new Error( + "Alberdi S.A. strikes again! las sucursales están rotas." + ); + } + appender.appendInteger(datasetId); + appender.appendInteger(parseInt(data.id_comercio)); + appender.appendInteger(parseInt(data.id_bandera)); + appender.appendInteger(parseInt(data.id_sucursal)); + appender.appendVarchar(data.sucursales_nombre); + appender.appendVarchar(data.sucursales_tipo); + appender.appendVarchar(data.sucursales_calle); + appender.appendVarchar(data.sucursales_numero); + appender.appendInteger(parseFloat(data.sucursales_latitud)); + appender.appendInteger(parseFloat(data.sucursales_longitud)); + appender.appendVarchar(data.sucursales_observaciones); + appender.appendVarchar(data.sucursales_barrio); + appender.appendVarchar(data.sucursales_codigo_postal); + appender.appendVarchar(data.sucursales_localidad); + appender.appendVarchar(data.sucursales_provincia); + appender.appendVarchar(data.sucursales_lunes_horario_atencion); + appender.appendVarchar(data.sucursales_martes_horario_atencion); + appender.appendVarchar(data.sucursales_miercoles_horario_atencion); + appender.appendVarchar(data.sucursales_jueves_horario_atencion); + appender.appendVarchar(data.sucursales_viernes_horario_atencion); + appender.appendVarchar(data.sucursales_sabado_horario_atencion); + appender.appendVarchar(data.sucursales_domingo_horario_atencion); + appender.endRow(); + }) + .on("error", (err) => { + console.error(err); }); - const keys = Object.keys(objs[0]); - if (!keys.includes("sucursales_longitud")) { - throw new Error("Alberdi S.A. strikes again! las sucursales están rotas."); - } - const lines = objs.map( - (data) => keys.map((key) => data[key]).join("\t") + "\n" - ); - - const tsv = `${keys.join("\t")}\n${lines.join("")}`; - await importTsv(db, "sucursales", tsv); + await new Promise((resolve) => stream.on("end", resolve)); + await appender.close(); } /** - * @param {Database} db - * @param {string} table - * @param {string} tsv - */ -async function importTsv(db, table, tsv) { - const dir = await fs.mkdtemp("/tmp/sepa-precios-importer-"); - try { - const tempFile = join(dir, "temp.tsv"); - await fs.writeFile(tempFile, tsv); - console.log( - `COPY ${table} FROM '${tempFile}' WITH (HEADER, DELIMITER '\t', NULL '', QUOTE '')` - ); - await db.exec( - `COPY ${table} FROM '${tempFile}' WITH (HEADER, DELIMITER '\t', NULL '', QUOTE '')` - ); - await fs.rm(dir, { recursive: true }); - } finally { - } -} - -/** - * @param {Database} db + * @param {DuckDBConnection} connection * @param {number} datasetId * @param {string} dir */ -async function importBanderas(db, datasetId, dir) { - const banderas = Papa.parse(await readFile(join(dir, "comercio.csv")), { - header: true, - }); - const objs = banderas.data.map((data) => ({ - id_dataset: datasetId, - ...data, - })); - const keys = [ - "id_dataset", - "id_comercio", - "id_bandera", - "comercio_cuit", - "comercio_razon_social", - "comercio_bandera_nombre", - "comercio_bandera_url", - "comercio_ultima_actualizacion", - "comercio_version_sepa", - ]; - const lines = objs - .filter((data) => data.id_comercio && data.id_bandera) - .map((data) => - keys - .map((key) => { - const value = data[key]; - if (typeof value !== "string") { - return value; - } - return value.replaceAll("\t", " ").trim(); - }) - .join("\t") - ); - const tsv = `${keys.join("\t")}\n${lines.join("\n")}`; +async function importBanderas(connection, datasetId, dir) { + const stream = await createReadStream(join(dir, "comercio.csv")); + const appender = await connection.createAppender("main", "banderas"); - await importTsv(db, "banderas", tsv); + stream + .pipe( + parse({ headers: true, delimiter: "|", ignoreEmpty: true, trim: true }) + ) + .on("data", (data) => { + if (!data.id_comercio || !data.id_bandera) return; + + appender.appendInteger(datasetId); + appender.appendInteger(parseInt(data.id_comercio)); + appender.appendInteger(parseInt(data.id_bandera)); + appender.appendVarchar(data.comercio_cuit); + appender.appendVarchar(data.comercio_razon_social); + appender.appendVarchar(data.comercio_bandera_nombre); + appender.appendVarchar(data.comercio_bandera_url); + appender.appendVarchar(data.comercio_ultima_actualizacion); + appender.appendVarchar(data.comercio_version_sepa); + appender.endRow(); + }) + .on("error", (err) => { + console.error(err); + }); + await new Promise((resolve) => stream.on("end", resolve)); + await appender.close(); +} + +/** + * @param {DuckDBConnection} connection + * @param {number} datasetId + * @param {string} dir + */ +async function importPrecios(connection, datasetId, dir) { + const { comercioCuit } = await getComercioMetadata(dir); + const productosCsvPath = join(dir, "productos.csv"); + + /** @type {CsvParserStream} */ + let csvStream; + + const appender = await connection.createAppender("main", "precios"); + + if (comercioCuit == "30612929455") { + // Libertad S.A. + const file = (await readFile(productosCsvPath)).replaceAll( + "|RAPTOR 6X16X45", + "/RAPTOR 6X16X45" + ); + csvStream = parseString(file, { + headers: true, + delimiter: "|", + ignoreEmpty: true, + trim: true, + }); + } else if (comercioCuit == "30578411174") { + // Alberdi S.A. + const file = (await readFile(productosCsvPath)).replaceAll(";", "|"); + csvStream = parseString(file, { + headers: true, + delimiter: "|", + ignoreEmpty: true, + trim: true, + }); + } else { + csvStream = (await createReadStream(productosCsvPath)).pipe( + parse({ headers: true, delimiter: "|", ignoreEmpty: true, trim: true }) + ); + } + if (["30707429468", "30589621499", "30663005843"].includes(comercioCuit)) { + // TODO: si tienen los valores, pero con otros nombres, por ejemplo + // productos_precio_lista seria precio_unitario_bulto_por_unidad_venta_con_iva. + // pero no quiero mentir, asi que por ahora no lo importo + throw new Error( + `No voy a importar el dataset ${dir} porque el formato está mal. Pero se podría importar. Pero por ahora no lo voy a hacer. Véase https://gist.github.com/catdevnull/587d5c63c4bab11b9798861c917db93b` + ); + } + + csvStream + .on("data", (data) => { + if ( + !data.id_comercio || + !data.id_bandera || + !data.id_sucursal || + !data.id_producto + ) + return; + + if (data.id_producto.includes("e+")) { + console.error(`[${dir}]`, "id_producto corrupto", data.id_producto); + return; + } + if (data.precio_unitario_bulto_por_unidad_venta_con_iva) { + console.error( + `[${dir}]`, + "tiene precio_unitario_bulto_por_unidad_venta_con_iva", + { + data, + } + ); + return; + } + delete data.id_dun_14; + appender.appendInteger(datasetId); + appender.appendInteger(parseInt(data.id_comercio)); + appender.appendInteger(parseInt(data.id_bandera)); + appender.appendInteger(parseInt(data.id_sucursal)); + appender.appendBigInt(BigInt(data.id_producto)); + appender.appendInteger(parseInt(data.productos_ean)); + appender.appendVarchar(data.productos_descripcion); + appender.appendInteger(parseFloat(data.productos_cantidad_presentacion)); + appender.appendVarchar(data.productos_unidad_medida_presentacion); + appender.appendVarchar(data.productos_marca); + appender.appendInteger(parseFloat(data.productos_precio_lista)); + appender.appendInteger(parseFloat(data.productos_precio_referencia)); + appender.appendInteger(parseFloat(data.productos_cantidad_referencia)); + appender.appendVarchar(data.productos_unidad_medida_referencia); + appender.appendInteger(parseFloat(data.productos_precio_unitario_promo1)); + appender.appendVarchar(data.productos_leyenda_promo1); + appender.appendInteger(parseFloat(data.productos_precio_unitario_promo2)); + appender.appendVarchar(data.productos_leyenda_promo2); + appender.endRow(); + }) + .on("error", (err) => { + console.error(err); + }); + await new Promise((resolve) => csvStream.on("end", resolve)); + await appender.close(); } /** @@ -136,16 +240,18 @@ async function importDataset(dir) { const id_comercio = basename(dir).match(/comercio-sepa-(\d+)/)?.[1]; // TODO: parsear "Ultima actualizacion" al final del CSV y insertarlo en la tabla datasets - const db = await Database.create("importer.db"); + const connection = await instance.connect(); try { - await db.exec("begin transaction"); - let datasetId; - const res = await db.all( + await connection.run("begin transaction"); + const res = await connection.run( `insert into datasets (id, name, date, id_comercio) values (nextval('seq_datasets'), '${basename(dir)}', '${date}', ${id_comercio}) returning id` ); + const rows = await res.getRows(); + if (!rows[0][0]) throw new Error("No se pudo insertar el dataset"); + console.log("inserted dataset"); - datasetId = res[0].id; + const datasetId = parseInt(rows[0][0].toString()); const comercios = Papa.parse(await readFile(join(dir, "comercio.csv")), { header: true, @@ -153,93 +259,20 @@ async function importDataset(dir) { const comercioCuit = comercios.data[0].comercio_cuit; console.log(`dataset ${datasetId}, comercio ${comercioCuit}`); - await importBanderas(db, datasetId, dir); - await importSucursales(db, datasetId, dir); + await importBanderas(connection, datasetId, dir); + await importSucursales(connection, datasetId, dir); + await importPrecios(connection, datasetId, dir); - let file = await readFile(join(dir, "productos.csv")); - // WALL OF SHAME: estos proveedores no saben producir CSVs correctos - if (comercioCuit == "30612929455") { - // Libertad S.A. - file = file.replaceAll("|RAPTOR 6X16X45", "/RAPTOR 6X16X45"); - } else if (comercioCuit == "30578411174") { - // Alberdi S.A. - file = file.replaceAll(";", "|"); - } - if (["30707429468", "30589621499"].includes(comercioCuit)) { - // TODO: si tienen los valores, pero con otros nombres, por ejemplo - // productos_precio_lista seria precio_unitario_bulto_por_unidad_venta_con_iva. - // pero no quiero mentir, asi que por ahora no lo importo - throw new Error( - `No voy a importar el dataset ${dir} porque el formato está mal. Pero se podría importar. Pero por ahora no lo voy a hacer. Véase https://gist.github.com/catdevnull/587d5c63c4bab11b9798861c917db93b` - ); - } - - console.time("parse"); - - const parsedData = Papa.parse(file, { - header: true, - skipEmptyLines: true, - }); - const objs = parsedData.data - .filter( - (data) => - data.id_comercio && - data.id_bandera && - data.id_sucursal && - data.id_producto - ) - .map((data) => { - delete data.id_dun_14; - return { - id_dataset: datasetId, - ...data, - productos_descripcion: data.productos_descripcion - .replaceAll("\t", " ") - .trim(), - productos_marca: data.productos_marca.trim(), - }; - }); - - const keys = [ - "id_dataset", - "id_comercio", - "id_bandera", - "id_sucursal", - "id_producto", - "productos_ean", - "productos_descripcion", - "productos_cantidad_presentacion", - "productos_unidad_medida_presentacion", - "productos_marca", - "productos_precio_lista", - "productos_precio_referencia", - "productos_cantidad_referencia", - "productos_unidad_medida_referencia", - "productos_precio_unitario_promo1", - "productos_leyenda_promo1", - "productos_precio_unitario_promo2", - "productos_leyenda_promo2", - ]; - - const lines = objs.map( - (data) => keys.map((key) => data[key]).join("\t") + "\n" - ); - - const tsv = `${keys.join("\t")}\n${lines.join("")}`; - await importTsv(db, "precios", tsv); - - console.timeEnd("parse"); - await db.exec("commit"); - console.info(`saved ${objs.length} rows`); + await connection.run("commit"); } catch (e) { // @ts-ignore - if (e.errorType == "Constraint") { + if (e.message.includes("Constraint Error: Duplicate key")) { console.log(`dataset ${basename(dir)} already exists`); - await db.exec("abort"); + await connection.run("abort"); return; } console.error("errored, aborting transaction", e); - await db.exec("abort"); + await connection.run("abort"); } finally { try { Bun.gc(true); @@ -252,12 +285,12 @@ async function importDataset(dir) { */ async function importDatasetTar(tarPath) { console.log(`importing tar ${tarPath}`); - const dir = await fs.mkdtemp("/tmp/sepa-precios-importer-"); + const dir = await fsp.mkdtemp("/tmp/sepa-precios-importer-"); try { await $`tar -x -C ${dir} -f ${tarPath}`; await importDump(dir); } finally { - await fs.rm(dir, { recursive: true }); + await fsp.rm(dir, { recursive: true }); } } @@ -265,23 +298,55 @@ async function importDatasetTar(tarPath) { * @param {string} dumpDir */ async function importDump(dumpDir) { - const pQueue = new PQueue({ concurrency: 1 }); const files = await fg("**/productos.csv", { cwd: dumpDir }); for (const file of files) { const dir = join(dumpDir, dirname(file)); - pQueue.add(() => importDataset(dir)); + await importDataset(dir); } - await pQueue.onIdle(); } -let hasTars = false; -const files = await fg("**/*.tar.zst", { cwd: process.argv[2] }); -for (const file of files) { - hasTars = true; - const tar = join(process.argv[2], file); - await importDatasetTar(tar); +/** + * @param {string} dir + */ +async function getComercioMetadata(dir) { + const comercios = Papa.parse(await readFile(join(dir, "comercio.csv")), { + header: true, + }); + const comercioCuit = comercios.data[0].comercio_cuit; + return { comercioCuit }; } -if (!hasTars) { - await importDump(process.argv[2]); +// ----------- +// tenemos que detectar si el archivo es UTF-16 o UTF-8 +// porque DORINKA SRL a veces envía archivos con UTF-16. +// ------------ + +/** + * @param {string} path + * @returns {Promise} + */ +async function readFile(path) { + const buffer = await fsp.readFile(path, { encoding: null }); + if (buffer[0] === 0xff && buffer[1] === 0xfe) { + return buffer.toString("utf16le"); + } else { + return buffer.toString("utf8"); + } +} + +/** + * @param {string} path + * @returns {Promise} + */ +async function createReadStream(path) { + const chunks = []; + for await (let chunk of fs.createReadStream(path, { start: 0, end: 1 })) { + chunks.push(chunk); + } + const header = Buffer.concat(chunks); + if (header[0] === 0xff && header[1] === 0xfe) { + return fs.createReadStream(path, { encoding: "utf16le" }); + } else { + return fs.createReadStream(path, { encoding: "utf8" }); + } } diff --git a/sepa/package.json b/sepa/package.json index c0f48b4..2b7e995 100644 --- a/sepa/package.json +++ b/sepa/package.json @@ -17,10 +17,12 @@ "dependencies": { "@aws-sdk/client-s3": "^3.651.0", "@aws-sdk/lib-storage": "^3.651.0", + "@duckdb/node-api": "^1.1.3-alpha.4", "date-fns": "^3.6.0", "drizzle-orm": "^0.33.0", "duckdb": "^1.1.3", "duckdb-async": "^1.1.3", + "fast-csv": "^5.0.2", "fast-glob": "^3.3.2", "jschardet": "^3.1.3", "p-queue": "^8.0.1",