投稿

3月, 2016の投稿を表示しています

MongoDB の collection 内の すべての key を取得する

RDBM関連データベースの table に相当する collection に key : value のペアーが保管されている、key は field に似ていますが、一つ一つのオブジェクトに入っている key は可変です。だから、RDBMの field の一覧を出すのは簡単ですが、MongoDB は collection 内のオブジェクトを巡って取ってくる必要がある。 mr = db.runCommand({ "mapreduce" : " my_collection ", "map" : function() { for (var key in this) { emit(key, null); } }, "reduce" : function(key, stuff) { return null; }, "out": "my_collection" + "_keys" }) db[mr.result].distinct("_id") my_collection は key を取得したい collection名に変更してください。 mr = db.runCommand({ "mapreduce" : " EFn ", "map" : function() { for (var key in this) { emit(key, null); } }, "reduce" : function(key, stuff) { return null; }, "out": "my_collection" + "_keys" }) { "result" : "my_collection_keys", "timeMillis" : 290837, "counts" : { "input&q

Mongodb で大量データ(390万件弱)をインポートしてみた

DPC外来のEFファイル(32列、2.1GB、3,883,160件)をMongodbにインポートしてみました。進捗の表示はずっと0.0Bなので、インポートできないと思ったが、一応ちゃんとインポートされて、所要時間はおよそ2分でした。しかもデータベース上の容量は 0.461GBで収またのですね。 db.EFn.find({"EF-0":201504}) で検索してみてもすぐレスポンスがあって、全然ストレスを感じませんでした。複雑な mapReduce はしていませんが、これからいろいろ分析してみます。 【以下オペレーション記録】 mongoimport --file DPC_EFn_201504-12_title.txt --headerline --type tsv -d dpc -c EFn --drop --ignoreBlanks 2016-03-24T12:16:06.388+0900 connected to: localhost 2016-03-24T12:16:06.389+0900 dropping: dpc.EFn 2016-03-24T12:16:09.378+0900 [........................] dpc.EFn 0.0 B/2.1 GB (0.0%) 2016-03-24T12:16:12.378+0900 [........................] dpc.EFn 0.0 B/2.1 GB (0.0%) 2016-03-24T12:16:15.377+0900 [........................] dpc.EFn 0.0 B/2.1 GB (0.0%) 2016-03-24T12:16:18.378+0900 [........................] dpc.EFn 0.0 B/2.1 GB (0.0%) 2016-03-24T12:16:21.378+0900 [........................] dpc.EFn 0.0 B/2.1 GB (0.0%) 2016-03-24T12:16:24.377+0900 [........................] dpc.

DPCデータ:厚労省 公開統計表 => Node.jsで自動ダウンロード(1)

とりあえずの目標は、下記のサイトにある各年度の公開統計表ページのURLを取得すること。 http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000049343.html 【gethtml.js】 / モジュールロード var http = require('http'); var Iconv = require('iconv').Iconv; // ダウンロード先URLを指定する var url = ' http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000049343.html '; // ダウンロードする var req = http.get(url, function (res) {      var html='';     // データを受け取るたびに、文字列を追加     res.on('data', function (line) { var iconv = new Iconv('SHIFT-JIS','UTF-8//TRANSLIT//IGNORE');         var link=iconv.convert(line).toString(); link = link.replace(/[\n\r]/g,""); html += link;     });     // ファイルのダウンロードが終わるとendイベントが呼ばれる     res.on('end', function () { var result=html.match(/<a href=.*?<\/a>/g); for (var i=0;i<result.length;i++){           var ancha=result[i].match(/<a href=[\'\"](.*?)[\'\"]>(.*?)<\/a>/);

Node.js:ネット巡回に必要な日本語コード変換

前回、簡単にHTMLファイルをダウロードしましたが、今回は日本語のエンコーディングがSHIFT-JISのページをUTF-8に変換して標準出力に出す方法を紹介します。 まず、追加する必要があるモジュールは node-iconv です。インストールは簡単です。 npm install iconv --save 【サンプルプログラム」gethtml.js // モジュールロード var http = require('http'); var Iconv = require('iconv').Iconv; // ダウンロード先URLを指定する var url = 'http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000049343.html'; // ダウンロードする var req = http.get(url, function (res) {     res.on('data', function (html) { var iconv = new Iconv('SHIFT-JIS','UTF-8//TRANSLIT//IGNORE'); console.log( iconv.convert(html).toString() );     });     // ファイルのダウンロードが終わるとendイベントが呼ばれる     res.on('end', function () {         console.log('finished!!!');     });  }); // 通信エラーなどはここで処理する req.on('error', function (err) {     console.log('Error: ', err); return; }); 【プログラム実行】node gethtml.js

Node.js:ネット巡回の第一歩

【getHTML.js】 // モジュールロード var http = require('http'); var fs = require('fs'); // ダウンロード先URLを指定する var url = 'http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000049343.html'; var outFile = fs.createWriteStream('file.html'); // ダウンロードする var req = http.get(url, function (res) {          // ダウンロードした内容をそのまま、ファイル書き出し。     res.pipe(outFile);     // ファイルのダウンロードが終わるとendイベントが呼ばれる     res.on('end', function () {         console.log('finish download.');     });  }); // 通信エラーなどはここで処理する req.on('error', function (err) {     console.log('Error: ', err); return; }); 【実行】node getHTML.js

DPCデータ:厚労省 公開統計表

イメージ
DPC導入の影響評価に関する調査  に現時点平成18年度から平成26年度のデータが公開されています。   平成26年度   平成25年度   平成24年度   平成23年度   平成22年度   平成21年度   平成20年度   平成19年度   平成18年度 これらのリンク先に主にPDFとExcelがありますが、まず自動的にExcelファイルをダウンロードしてみるのは面白いかもしれません。 一応、手動でダウンロードしてみましたが、Excel ファイルは、古い xls の形式なので、 ssconvert で直接ダウンロードして xlsx に変換した。ちなみに、ssconvertは  gnumericの一部なので、debianは、sudo apt-get install gnumeric でインストールする。Macは、brew install gnumeric でインストールする 【ダウンロード&変換】 ssconvert http://www.mhlw.go.jp/file/05-Shingikai-12404000-Hokenkyoku-Iryouka/0000104287.xls 0000104287.xlsx なんで、変換する必要があるのかどういうと、Node.js の exceljs  で中身を取り出したいのだ(npm install exceljsで debian や mac でインストールできる) 【app.js】 var Excel = require('exceljs'); var targetExcelPath = "0000104287.xlsx"; var workbook = new Excel.Workbook(); workbook.xlsx.readFile(targetExcelPath).then(function () {     var sheet1 = workbook.getWorksheet(1);     for(var i=1;i<=10;i++){         var str = "";         for(var j=1;j<=10;j++){

DPCデータ:後発医薬品指数計算:後発品の薬価収載動向の把握

「薬価収載」を google で検索したら、いろいろなサイトが出てきますが、 そこでいくつかいつどのような薬が収載される情報を提供しているサイトもあります。  後発品の収載動向を把握しないと母数が変わりますので、特に大型新薬が特許切れのときにかなり指数に響くからです。 しかし、データ再利用の利便性を考えないとそこらのサイトから取ってきたデータをメンテナンスするのは大変苦労なことになるかもしれません。 MEDISが、提供している「薬価基準収載医薬品コード」というページのほうが再利用性が高いと思います。これらのファイルを使いやすく加工したものも今後提供することを考えています。乞うご期待! http://www2.medis.or.jp/ycode/  【他に参考になるサイト】 ・おくすり110番の 薬価収載等

DPCデータ:後発医薬品指数計算:使用するマスターの決定

イメージ
いままで、後発医薬品指数の計算には社会保険診療報酬支払基金の医薬品マスターが使用されていると下記のPDFに明記されています。 http://www.mhlw.go.jp/file/05-Shingikai-12404000-Hokenkyoku-Iryouka/D-2.pdf 同PDFに「厚生労働省ホームページにおいて、平成 25 年4月1日からの後発医薬品情 報等を含む詳細なマスターが公開されたことから、今後は厚生労働省のマ スターを使用する。」と記載しているので、これからは厚労省のマスターで行こうということですね。 では厚労省のマスターってなんでしょうか? google で「薬価収載」で検索すれば、大体トップに来ていますが、注意するところは、 厚労省のページに書かれている下記のようなタイトルに適用年月日は最新かどうかですね。 薬価基準収載品目リスト及び後発医薬品に関する情報について( 平成27年12月11日適用 ) このページの5.その他に貼ってあるExcelファイルがマスターになるわけです。 しかし、このマスターは多分そのままじゃ厳密な分析には使えないだろうと思いますね。だって、 (平成25年12月13日~平成26年2月2日の期間における算出にはこちら。) のように書いてありますから、この適用期間もマスターのデータの一部にしないと使いにくいだろうと思います。 今後順次にこれらのファイルを基に使いやすいファイルを提供していこうと考えております。乞うご期待!

データ・マジシャンをオープンしました。

このブログは、変幻自在のデータ扱いを紹介するサイトを目指します。