nodejsファイルは中国語を探して、英語に変えます.

11727 ワード

以前の同僚の需要を解決してください.中国語の項目は英語の項目を訳します.
具体的な実現の問題を考えると、スマートであれば、中国語の文法分析をする必要がありますが、これは難しいと思います.
最後の案はファイルを巡回して、中国語のフレーズを合わせて、人工的に訳して、中国語のフレーズを翻訳の内容に変えます.もちろん後期には人工的な再検査が必要です.コードの中の中国語は関連のプログラムに影響を与えるかもしれません.
この問題は、明らかにマルチスレッド、ファイルの読み書きに関連しています.第一時間ではnodejsが思いつきました.nodejsはメインスレッドですが、非同期ファイルの読み書き、イベント応答メカニズムは、スレッドを呼び出したに違いないです.実際にプログラムする時はスレッドの関係を考慮する必要はありません.
コードは以下の通り複雑ではありません.書き終わったら、適当に包装します.
var fs = require('fs');
var http = require('http');
var filePath = 'D:\\WORK_new\\';
var logPath = 'D:\\chinese.log';

var map = {};
var num = 0;

var dictionary = (function () {
    var map = {};
    return {
        logPath: 'D:\\chinese.log',
        set: function (key, val) {
            map[key] = val || '';
        },
        get: function (key) {
            return map[key]||'';
        },
        save2File: function () {
            fs.writeFile(this.logPath, JSON.stringify(map).replace(/","/g,'",\r
"'),{encoding:'utf8',flag:'w'}, function (err) { if (err) throw err; }); }, loadFile: function (callback) { fs.readFile(this.logPath, {encoding:'utf8'},function (err, data) { map = JSON.parse(data); callback(); }) }, translateByGoogle: function (callback) { var index = 0; for (var key in map) { if (map[key] == '') { index++; (function (key) { http.get("http://translate.google.cn/translate_a/t?client=t&hl=zh-CN&sl=zh-CN&tl=en&ie=UTF-8&oe=UTF-8&oc=2&otf=1&ssel=3&tsel=6&sc=2&q="+key, function(res) { res.setEncoding('utf8'); var body = ""; res.on('data', function (chunk) { body+=chunk; }).on('end', function (){ var obj = eval('('+body+')'); map[key] = obj[0][0][0]; index--; if (index == 0) { callback(); } }); }).on('error', function(e) { console.log('http error'); index--; if (index == 0) { callback(); } console.log("Got error: " + e.message); }); })(key); } } } } })(); function File () { var index = 0; var _readFile = function (pathStr, fileBack, doneBack) { fs.readFile(pathStr,{encoding:'utf8'}, function (err, data) { index--; if (err) { data = ""; console.log(err,pathStr) //throw err; } fileBack(data,pathStr); if (index == 0) { doneBack(); } }); }; var _walkDir = function (pathStr, fileBack, doneBack) { fs.readdir(pathStr, function (err, files) { files.forEach(function (file) { if(fs.statSync(pathStr + '/' + file).isDirectory()){ _walkDir(pathStr + '/' + file, fileBack, doneBack); } else { if (/.js$|.html$|.htm$|.jsp$/.test(file)){ index ++; _readFile(pathStr + '/' + file, fileBack, doneBack); } return; } }); }); } this.walkDir = function (pathStr, fileBack, doneBack) { index = 0; _walkDir(pathStr, fileBack, doneBack); } } // dictionary.logPath = logPath; new File().walkDir(filePath, function (data) { if (!!data) { var match = data.match(/[\u4e00-\u9faf]+/g); if (!!match) { match.forEach(function (mat) { dictionary.set(mat); }) } } }, function () { console.log(' OK'); dictionary.save2File(); }) // google /* dictionary.loadFile(function () { dictionary.translateByGoogle(function () { dictionary.save2File(); }) }); */ // /* dictionary.loadFile(function () { new File().walkDir(filePath, function (data,pathStr) { fs.writeFile(pathStr, data.replace(/[\u4e00-\u9faf]+/g, function (ch) { return dictionary.get(ch); }),{encoding:'ascii',flag:'w'}, function (err) { if (err) throw err; }); }, function () { console.log(' OK'); }) }); */
 
問題はまだあります
1.nodejs符号化問題は、window環境でGBKコードに対するサポートがよくなく、主にutf 8ファイルの処理です.
2.効率の上でスレッドを通して最適化できるかもしれません.これは深く考えていません.
3.一致して、単一の句読点のフレーズなどがあるかもしれません.人工的に調べる必要があります.
実際には、ファイルはGBKであり、一部のファイルはutf 8であり、その後もスクリプト言語を通じて考慮される. 速い手で実現する時、
1.ファイルコードの問題は、検索によって判断されます.
ファイルトップ3バイトが正しいかどうかを判断します. ef bbは、しかし、これはBOMがあるutf 8フォーマットに対してだけです.
BOMがないutf 8フォーマットについては、バイトの特徴コードの判断が必要です(難度があり、精力が限られています.上記の案を使って、BOMがない場合は、人工的に調査します).
2.快手マルチスレッドはプログラミングが簡単なので、マルチスレッドはシングルラインより効率がいいとずっと思っています.実際の状況は思っていたのと違って、スレッドの方がマルチスレッドよりずっと速いです.メインのボトルネックはやはりファイルIOを読んで書いているところです.