2013-08-01 12 views
5

Pytam niektóre pliki MDB w nodejs na Linuksie przy użyciu pakietu MDBTools, unixodbc i node odbc.Jak odczytać kolumny typu double w plikach MDB w węźle?

Za pomocą tego kodu

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(); 
}); 

mogę zapytać kolumnę my_str_col ciąg, ale nie mogę rozszyfrować kolumnę my_dbl_colDouble, mam coś takiego:

[ { 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\[email protected]' } ] 

Nie wszystko puste struny 7 lub 8 bajtów, ale najbardziej przeszkadza mi drugi wiersz tego przykładu, w którym otrzymuję pusty ciąg, podczas gdy wiem, że w MDB jest numer niezerowy: oznacza to, że nie mogę próbować budować liczb z bajtów ciągu .

Jak mogę odczytać numery typu Double w pliku MDB w węźle na Linuksie?

I precyzyjny że

  • narzędziem jak MDBViewer (używając MDBTools) poprawnie odczytuje te numery
  • numery JavaScript będzie wystarczająco precyzyjne dla mnie te liczby to wszystko zmieścić w float32
  • mogę” t zastosować długie konwersje na plikach MDB: muszę szybko wyszukiwać w kilkuset często zmienianych plikach ...
  • Rozwiązanie, w którym nie mogę naprawdę wystawiać zapytań, ale które pozwala mi przeczytać całą tabelę byłoby również do zaakceptowania

Odpowiedz

3

Ponieważ nie udało mi się uzyskać węzła-odbc, aby poprawnie odszyfrować liczby, napisałem funkcję wywołującą mdb-export (która jest bardzo szybka) i czytającą całą tabelę.

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 desired 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 required cells 
      read(colIndexes.map(function(index){ return ~index ? cells[index] : null })); 
     } 
    }); 
    cmd.on('exit', function (code) { 
     if (done) done(code); 
    }); 
} 

Oto przykład, w którym zbudować tablicę ze wszystkimi rzędami przykład pytaniem jest:

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'); 
}); 

Wszystko jest odczytywany jako ciągi znaków, ale łatwe do analizowania:

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

Zaskakujące , jest to szybsze niż wysyłanie zapytań przy użyciu węzła-odbc i linuxodbc.

+0

Użytkownicy, którzy chcą zastosować to do plików zainstalowanych za pomocą Samby, mogą być zainteresowani tym pokrewnym pytaniem: http://askubuntu.com/questions/339354/cant-alloc-filename-when-executing-mdb-export-on-a -mounted-file/339602? noredirect = 1 # comment433332_339602 –

Powiązane problemy