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