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