Mejoras generales
This commit is contained in:
89
uploadcsv.js
Normal file
89
uploadcsv.js
Normal file
@@ -0,0 +1,89 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import readline from 'node:readline';
|
||||
import { dataLineToObject } from './libs/utils.js';
|
||||
|
||||
// Ruta del CSV de salida: tercer argumento o 'csvParaSubir.csv' por defecto
|
||||
const outputPath = process.argv[3] || path.join('.', 'csvParaSubir.csv');
|
||||
const output = fs.createWriteStream(outputPath);
|
||||
// Timestamp de la línea anterior para evitar duplicados
|
||||
let prevTimestamps = [];
|
||||
// Encabezados para el CSV de salida
|
||||
output.write('created_at,entry_id,field1,field2,field3,field4,field5,field6,field7,latitude,longitude,elevation,status\n');
|
||||
|
||||
// Ruta del CSV: primer argumento o 'logs/datos.csv' por defecto
|
||||
const inputPath = process.argv[2] || path.join('.', 'datos.csv');
|
||||
|
||||
// Comprobamos que el archivo existe
|
||||
if (!fs.existsSync(inputPath)) {
|
||||
console.error(`Archivo no encontrado: ${inputPath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
// Creamos interfaz de lectura de líneas
|
||||
const rl = readline.createInterface({
|
||||
input: fs.createReadStream(inputPath),
|
||||
crlfDelay: Infinity
|
||||
});
|
||||
|
||||
rl.on('line', async (line) => {
|
||||
const obj = dataLineToObject(line);
|
||||
if (obj) {
|
||||
try {
|
||||
if (obj === null || obj === undefined) {
|
||||
return;
|
||||
}
|
||||
const datosParaEnviar = {
|
||||
created_at: obj.datetimeGPS.toISOString(),
|
||||
delta_t: 1, // Activar si da problemas con el tiempo
|
||||
field1: obj.paquetes,
|
||||
field2: obj.temperatura,
|
||||
field3: obj.presion,
|
||||
field4: obj.altitudSegunPresion,
|
||||
field5: obj.altitudMetros,
|
||||
field6: obj.velocidadKmph,
|
||||
field7: obj.numSatelites,
|
||||
latitude: obj.latitud,
|
||||
longitude: obj.longitud
|
||||
};
|
||||
// Ajustar created_at si coincide con alguno de los últimos 10 timestamps
|
||||
let currentDate = new Date(datosParaEnviar.created_at);
|
||||
// Mientras choque con alguno de los últimos 10, suma un segundo
|
||||
while (prevTimestamps.some(ts => ts.getTime() === currentDate.getTime())) {
|
||||
currentDate.setSeconds(currentDate.getSeconds() + 1);
|
||||
}
|
||||
datosParaEnviar.created_at = currentDate.toISOString();
|
||||
// Actualizar lista y mantener solo 10 elementos
|
||||
prevTimestamps.push(new Date(datosParaEnviar.created_at));
|
||||
if (prevTimestamps.length > 10) {
|
||||
prevTimestamps.shift();
|
||||
}
|
||||
// Escribir una línea en el CSV de salida
|
||||
const entryId = obj.paquetes;
|
||||
const csvLine = [
|
||||
datosParaEnviar.created_at,
|
||||
entryId,
|
||||
datosParaEnviar.field1,
|
||||
datosParaEnviar.field2,
|
||||
datosParaEnviar.field3,
|
||||
datosParaEnviar.field4,
|
||||
datosParaEnviar.field5,
|
||||
datosParaEnviar.field6,
|
||||
datosParaEnviar.field7,
|
||||
datosParaEnviar.latitude,
|
||||
datosParaEnviar.longitude,
|
||||
'', // elevation
|
||||
'' // status
|
||||
].join(',') + '\n';
|
||||
output.write(csvLine);
|
||||
//console.log(`Enviado paquete ${obj.paquetes}`);
|
||||
} catch (err) {
|
||||
console.error('Error al subir dato:', err);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
rl.on('close', () => {
|
||||
output.end();
|
||||
console.log(`CSV listo para subir a thingspeak: ${outputPath}`);
|
||||
process.exit(0);
|
||||
});
|
||||
Reference in New Issue
Block a user