¿Cómo leer columnas de tipo dobles en files MDB en un nodo?

Estoy consultando algunos files MDB en nodejs en linux usando MDBTools , unixodbc y el package odbc del nodo .

Usando este código

db.query("select my_str_col, my_dbl_col from my_table", function (err, rows) { if (err) return console.log(err); console.log(rows); db.close(); }); 

Puedo consultar la columna de cadena my_str_col pero no puedo descifrar la columna Double my_dbl_col . Obtengo algo como esto:

 [ { my_str_col: 'bla', my_dbl_col: '{\u0014 Gai @' }, { my_str_col: 'bla bla', my_dbl_col: '' }, { my_str_col: 'bla', my_dbl_col: ' G z\u0014NF@' } ] 

Todas las cadenas no vacías tienen 7 u 8 bytes, pero lo que más me molesta es la segunda fila de este ejemplo, donde obtengo una cadena vacía mientras sé que hay un número no nulo en el MDB: significa que no puedo intentar build el numbers de los bytes de cadena.

Entonces, ¿cómo puedo leer los numbers del tipo Double en un file MDB en un nodo en Linux?

Yo preciso eso

  • una herramienta como MDBViewer (usando MDBTools) lee correctamente esos numbers
  • Los numbers de JavaScript serán lo suficientemente precisos para mí: todos esos numbers encajarían en float32
  • No puedo aplicar conversiones largas en los files MDB: debo hacer consultas rápidas en unos cientos de files cambiados con frecuencia …
  • una solución en la que realmente no puedo hacer consultas pero que me permite leer toda la tabla también sería aceptable

Como no pude get node-odbc para descifrar correctamente los numbers, escribí una function que llamaba a mdb-export (que es muy rápido) y leía toda la tabla.

 var fs = require("fs"), spawn = require('child_process').spawn, byline = require('byline'); // npm install byline // Streaming reading of choosen columns in a table in a MDB file. // parameters : // args : // path : mdb file complete path // table : name of the table // columns : names of the desinetworking columns // read : a callback accepting a row (an array of strings) // done : an optional callback called when everything is finished with an error code or 0 as argument function queryMdbFile(args, read, done) { var cmd = spawn('/usr/bin/mdb-export', [args.path, args.table]); var rowIndex = 0, colIndexes; byline(cmd.stdout).on('data', function (line) { var cells = line.toString().split(','); if (!rowIndex++) { // first line, let's find the col indexes var lc = function(s){ return s.toLowerCase() }; colIndexes = args.columns.map(lc).map(function(name) { return cells.map(lc).indexOf(name); }); } else { // other lines, let's give to the callback the requinetworking cells read(colIndexes.map(function(index){ return ~index ? cells[index] : null })); } }); cmd.on('exit', function (code) { if (done) done(code); }); } 

Aquí hay un ejemplo en el que construyo una matriz con todas las filas del ejemplo de la pregunta:

 var rows = []; queryMdbFile({ path: "mydatabase.MDB", table: 'my_table', columns : ['my_str_col', 'my_dbl_col'] },function(row) { rows.push(row); },function(errorCode) { console.log(errorCode ? ('error:'+errorCode) : 'done'); }); 

Todo se lee como cadenas pero es fácil de analizar:

 [ ['bla', '1324' ], ['bla bla', '332e+5'], ['bla', '43138' ] ] 

Sorprendentemente, esto es más rápido que consultar utilizando node-odbc y linuxodbc.