如何使用Node.js将本地SQL文件转换为JSON

3

我希望能够在node中将本地的sql文件(backup.mysql,大约50mb)转换为json格式。我在搜索一些插件时没有找到合适的,大多数需要一个sql服务器来转换数据。是否有任何读者或插件可以将sql文件转换为json?谢谢!

这就是我的sql文件的样子:

INSERT INTO `field_data_body` VALUES ('node','post','0','7112','1942','und','0','<p style="text-align: ce...  <-- 14269 lines like this.

我希望你能帮我将SQL转换为JSON在Node.js中使用:
    _fs.readFile( _path.in[_i], _encode, ( _err, _result ) => {
        if( _err )
        c.log( '$fs.readFile(), ' + _err );
        else {
            _result = _schema + '=' + JSON.stringify( _result, null, 4 ); //<-- what should i do with _result?
            _fs.writeFile( _path.out[_i], _result, _err => {
                if( _err )
                c.log( '$fs.writeFile(), ' + _err );
                else
                c.log( 'convert "' + _path.in[_i] + '" to "' + _path.out[_i] + '"' );
            });
        }
    });.

更新

我知道有一个工具(http://www.csvjson.com/sql2json)可以完成这项工作,但我的SQL数据太大了无法处理。

更新2

感谢Yohanes Gultom,以下代码可以解决问题。

//dependence libraries
//fs underscore underscore.string
const
c = console,
_fs = require( 'fs' ),
_path = {
    in: [
        'in.mysql',
    ],
    out: [
        'out2.json',
    ],
},
_encode = 'utf-8';

for( let _i in _path.in ) {
    if( _path.out[_i] ) {
        _fs.readFile( _path.in[_i], _encode, ( _err, _result ) => {
            if( _err )
            c.log( '$fs.readFile(), ' + _err );
            else {
                _result = JSON.stringify( $convert( _result ) );
                _fs.writeFile( _path.out[_i], _result, _err => {
                    if( _err )
                    c.log( '$fs.writeFile(), ' + _err );
                    else
                    c.log( 'convert "' + _path.in[_i] + '" to "' + _path.out[_i] + '"' );
                });
            }
        });
    }
}

//
const
_ = require( 'underscore' ),
s = require( 'underscore.string' );
function $convert(a){if(0==a.length)throw errorEmpty;a=a.replace(/(?:\/\*(?:[\s\S]*?)\*\/)|(?:([\s;])+\/\/(?:.*)$)/gm,"$1").replace(/^--.*[\r\n]/gm,"").replace(/^\s*[\r\n]/gm,"").replace(/;\s*[\r\n]/gm,";;").replace(/[\r\n]/gm," ").replace(/;;\s?/gm,";\n");var b=_.lines(a);if(0==b.length)throw errorEmpty;var d,e,c={};try{for(d=0;d<b.length;d++)if(e=b[d],words=_.words(e),words.length)if(words.length>=3&&"CREATE"==words[0].toUpperCase()&&"TABLE"==words[1].toUpperCase()){for(var f=2;!words[f].match(inQuotes)&&f<words.length;)f++;if(f>=words.length)throw"Cannot find table name in CREATE TABLE statement.";var g=_.trim(words[f],"`'\"");c[g]={header:[],values:[]};var h=_(e).chain().strRight("(").strLeftBack(")").words(",").value();if(c[g].header=_.reduce(h,function(a,b){var c=_.words(b);if(!c.length)throw"Cannot find columns for table "+g;var d=_.trim(c[0]);return(_.startsWith(d,"'")||_.startsWith(d,"`")||_.startsWith(d,'"'))&&a.push(_.trim(d,"`'\"")),a},[]),!c[g].header.length)throw"No columns found for table "+g}else if(words.length>=4&&"INSERT"==words[0].toUpperCase()&&"INTO"==words[1].toUpperCase()&&words[2].match(inQuotes)&&"VALUES"==words[3].toUpperCase()){var g=_.trim(words[2],"`'\"");if(!c[g])throw"Table "+g+" was not defined in a CREATE TABLE.";for(var f=(c[g],3);"VALUES"!=words[f].toUpperCase()&&f<words.length;)f++;if(f==words.length||"VALUES"!=words[f].toUpperCase())throw"Error parsing INSERT INTO statement. Cannot find VALUES.";if(f+=1,f==words.length)throw"Error parsing INSERT INTO statement. No values found after VALUES.";var j=_.trim(words.slice(f).join(" ")).replace(/(\))\s*,\s*(\()/g,"),(").replace(/^\(/,"").replace(/\)$/,"").split("),(");_.each(j,function(a){var b=_.words(a,",");c[g].values.push(_.map(b,function(a){return _.trim(a," `'\"")}))})}else if(words.length>=4&&"INSERT"==words[0].toUpperCase()&&"INTO"==words[1].toUpperCase()&&words[2].match(inQuotes)&&_.startsWith(words[3],"(")){var g=_.trim(words[2],"`'\"");if(!c[g])throw"Table "+g+" was not defined in a CREATE TABLE.";for(var f=(c[g],3);"VALUES"!=words[f].toUpperCase()&&f<words.length;)f++;if(f==words.length||"VALUES"!=words[f].toUpperCase())throw"Error parsing INSERT INTO statement. Cannot find VALUES.";var k=_.map(words.slice(3,f),function(a){return _.trim(a,"(), `'\"")});if(!k.length)throw"Error parsing INSERT INTO statement. No column names found for table "+g+" in "+words[3];if(words[3],f+=1,f==words.length)throw"Error parsing INSERT INTO statement. No values found after VALUES.";var j=_.trim(words.slice(f).join(" ")).replace(/(\))\s*,\s*(\()/g,"),(").replace(/^\(/,"").replace(/\)$/,"").split("),(");_.each(j,function(a){var b=_.words(a,",");if(b.length!=k.length)throw"Error parsing INSERT INTO statement. Values "+a+" does not have the same number of items as columns "+words[3];var d={};_.each(c[g].header,function(a){var c=_.indexOf(k,a),e=c!=-1?_.trim(b[c]," `'\""):null;d[a]=e}),c[g].values.push(_.values(d))})}}catch(a){throw"Error: "+a+"\n..."+e}var l={};return _.each(c,function(a,b){var c=a.header;l[b]=_.map(a.values,function(a){for(var b={},d=0;d<c.length;d++)b[c[d]]=a[d];return b})}),l}_.mixin(s.exports());var errorEmpty="Please upload a file or type in something.",inQuotes=new RegExp(/(^`.*`$)|(^'.*'$)|(^".*"$)/);

可能是重复的问题:如何将MySQL数据库导出为JSON? - Jehy
请参见https://dev59.com/N5rga4cB1Zd3GeqPkk3r。 - Jehy
我想用Node.js来完成它。 - facebook-570128180
2个回答

6

谢谢你,你让我的一天变得美好,我刚刚更新了我的问题。 - facebook-570128180

0

我认为最简单的方法是将您的备份导入数据库,以CSV格式导出,然后将CSV转换为JSON。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接