2013-08-01 46 views
5

Tôi đang truy vấn một số tệp MDB trong nútjs trên linux bằng cách sử dụng MDBTools, unixodbc và gói node odbc.Làm thế nào để đọc các cột loại tăng gấp đôi trong các tệp MDB trong nút?

Sử dụng mã này

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

tôi có thể truy vấn các cột my_str_col chuỗi nhưng tôi không thể giải mã cột my_dbl_colDouble, tôi nhận được một cái gì đó như thế này:

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

chuỗi Tất cả không có sản phẩm nào là 7 hoặc 8 byte nhưng những gì làm phiền tôi nhất là hàng thứ hai của ví dụ này, nơi tôi nhận được một chuỗi rỗng trong khi tôi biết có một số không null trong MDB: nó có nghĩa là tôi không thể cố gắng để xây dựng các số từ chuỗi byte .

Vì vậy, làm cách nào tôi có thể đọc số loại Double trong tệp MDB trong nút trên linux?

tôi chính xác rằng

  • một công cụ như MDBViewer (sử dụng MDBTools) một cách chính xác đọc những con số
  • số JavaScript sẽ đủ chính xác cho tôi: những con số tất cả sẽ phù hợp trong float32
  • Tôi có thể' t áp dụng các chuyển đổi dài trên các tệp MDB: Tôi phải thực hiện các truy vấn nhanh trên vài trăm tệp được thay đổi thường xuyên ...
  • một giải pháp mà tôi không thể thực sự đưa ra các truy vấn, nhưng cho phép tôi đọc toàn bộ bảng cũng được chấp nhận

Trả lời

3

Vì tôi không thể nhận được nút-odbc để giải mã chính xác số, tôi đã viết một hàm gọi mdb-export (rất nhanh) và đọc toàn bộ bảng.

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

Dưới đây là một ví dụ trong đó tôi xây dựng một mảng với tất cả các hàng của các ví dụ của câu hỏi:

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

Mọi thứ đều được đọc như dây đàn nhưng dễ dàng để phân tích:

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

Đáng ngạc nhiên là đủ , điều này nhanh hơn truy vấn bằng cách sử dụng nút-odbc và linuxodbc.

+0

Người dùng muốn áp dụng điều này cho các tệp được gắn bằng Samba có thể được quan tâm bởi câu hỏi liên quan này: http://askubuntu.com/questions/339354/cant-alloc-filename-when-executing-mdb-export-on-a -mounted-file/339602? noredirect = 1 # comment433332_339602 –