nodejs で百本ノックを受けてみる 第2章

たまたま 見かけた 言語処理100本ノック2015。せっかくなので 勉強中のnodejsで試してみる

環境は Win[7|10] Pro x64 と node.js の 8.x系

コードがクズなのは、JSも勉強中だから ということで

次に第2章: UNIXコマンドの基礎

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

var async = require('async');
var fs    = require('fs');
let cnt = 0;
async.forEachSeries(fs.readFileSync('hightemp.txt','utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0) {
        console.log(line);
        fs.appendFileSync('hoge.txt', line.replace( /\t/g, ' ' ) + '\n','utf8');
        cnt = cnt + 1;
    }
    cb();
}, function() {
  console.log(cnt);
});

同期取りながらファイルを読み込むのって どういうのが良いのだろうね??

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

var async = require('async');
var fs    = require('fs');
//fs.unlinkSync('col1.txt');
//fs.unlinkSync('col2.txt');
async.forEachSeries(fs.readFileSync('hightemp.txt', 'utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        let ary = line.split(/\t/g);
        console.log(ary);
        fs.appendFileSync('col1.txt', ary[0] + '\n', 'utf8');
        fs.appendFileSync('col2.txt', ary[1] + '\n', 'utf8');
    }
    cb();
}, function() {
  console.log('end');
});

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはsort, uniqコマンドを用いよ.

var async = require('async');
var fs    = require('fs');
let map1 = new Map();
async.forEachSeries(fs.readFileSync('hightemp.txt','utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        let str1 = line.split('\t');
        if (map1.has(str1[0])) {
            map1.set(str1[0], map1.get(str1[0]) + 1)
        } else {
            map1.set(str1[0], 1)
        }
    }
    cb();
}, function() {
    let ary3 = Array.from(map1.keys()); //iterator->array
    let ary4 = ary3.filter(function (x, i, self) {
                return self.indexOf(x) === i;
            }); // distinct
    console.log(ary4);
    console.log('end');
});

linq版
var async = require('async');
var fs    = require('fs');
var Enumerable = require('linq');
let ary = [];
let map1 = new Map();
async.forEachSeries(fs.readFileSync('hightemp.txt','utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        let str1 = line.split('\t');
        let ary0 = [];
        ary0.name = str1[0];
        ary0.data = 1;
        ary.push(ary0);
    }
    cb();
}, function() {
    let out = Enumerable.from(ary)
                        .groupBy(x => x.name)
                        .select(function (x) { return x.name}).toArray();
    console.log(out);
    console.log('end');
});

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

行数が少ないから、できるコードなんですが・・・

var async = require('async');
var fs    = require('fs');
var Enumerable  = require('linq');
let ary = [];
async.forEachSeries(fs.readFileSync('hightemp.txt', 'utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        let str1 = line.split('\t');
        let obj = new Object;
        obj.temp = str1[2];
        obj.line = line;
        ary.push(obj);
    }
    cb();
}, function() {
    let out1 = Enumerable
                .from(ary)
//                .orderBy("i=>i.temp")
                .orderByDescending("i=>i.temp")
                .toArray();
    console.log(out1);
});

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

使ってみたかったlinq.jsを試してみる。

linqってgroupby、orderby が組み合わさると分かりづらいよなぁ・・

var async = require('async');
var fs    = require('fs');
var Enumerable  = require('linq');

let ary = [];

async.forEachSeries(fs.readFileSync('hightemp.txt',
'utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        let str1 = line.split('\t');
        let obj = new Object;
        obj.names = str1[0];
        obj.count = 1;
        ary.push(obj);
    }
    cb();
}, function() {
    let out1 = Enumerable
                .from(ary)
                .groupBy("$.names", "$.count", function (key, group) {return group.count() + "," + key })
                .orderBy("i=>i")
//                .orderByDescending("i=>i")
                .toArray();

    for(let i in out1) {
        let pp =  out1[i].split(',');
        console.log(pp[0] + ' ' + pp[1]);
    }
});