nodejs:csvモジュール解析

8663 ワード

Nodejs
最大の特徴は、イベント駆動と非同期同時操作に基づいていることです.多くの人が知っている
nodejs
ネットバックグラウンドサービスに用いる新しいプラットフォームであり、バックグラウンドサービスを便利に提供することができる.ネットワーク開発に使われているほか、実は
nodejs
オフラインファイルの同時処理も便利で、
C++

java
利用する
nodejs
読み取りと書き込みのフレームワークを迅速に構築し、ファイル処理操作を実現できます.
         プログラム開発でよく見られるファイルフォーマット(csv)の処理について説明します.Nodejs公式サイトで提供されている開発パッケージにはcsvに関するパッケージが多く、ダウンロード数が最も多いのはCSVパッケージで、以下ではCSVパッケージを使用してファイルを処理する方法を紹介します.
まず、パッケージをダウンロードします.
npm install csv
公式サイトの例で使い方を解析します.
 
//node samples/string.js
var csv =require('csv');
csv()

.from('"1","2","3","4"
"a","b","c","d"'
)

.to(console.log )
//Output:

//1,2,3,4
//a,b,c,d

 
    まずcsvモジュール、require('csv')を参照し、参照した後、カプセル化された方法と属性を直接使用することができます.csv()はオブジェクトをインスタンス化することに相当し、.fromと.toはcsvパッケージの方法です.
.from()メソッド:名前の通り、ソースファイルからデータを読み出し、パラメータは上のように文字列を直接伝えることも、下の高度なアプリケーションのソースファイルのパスを適用することもできます.
.to()メソッド:formメソッドから読み出したデータを出力し、コンソールにもターゲットファイルにも出力できます.この例はコンソールに出力します.
 
 1 // node samples/sample.js
 2 var fs =require('fs');
 3 var csv =require('csv');
 4 csv()
 5 .from.stream(fs.createReadStream(__dirname+'/sample.in'))
 6 .to.path(__dirname+'/sample.out')
 7 .transform(function(row){
 8 row.unshift(row.pop());
 9 return row;
10 })
11 .on('record',function(row,index){
12 console.log('#'+index+' '+JSON.stringify(row));
13 })
14 .on('close',function(count){
15 // when writing to a file, use the 'close' event
16 // the 'end' event may fire before the file has been written
17 console.log('Number of lines: '+count);
18 })
19 .on('error',function(error){
20 console.log(error.message);
21 });
22 // Output:
23 // #0 ["2000-01-01","20322051544","1979.0","8.8017226E7","ABC","45"]
24 // #1 ["2050-11-27","28392898392","1974.0","8.8392926E7","DEF","23"]
25 // Number of lines: 2

 
 
 
.transform()メソッド:fromが読み出したデータを処理し、処理後にターゲットファイルに書き込む.パラメータはコールバック関数を伝達し,コールバック関数ではデータを処理する方法を書くことができる.
.on() : イベントリスニングメカニズム
'cord'は読み出した各行の記録を傍受し、パラメータのrowは1行のデータであり、indexはデータの数である.このデータの数は読み出したデータの数であり、処理済みのデータの数ではない.nodejsは非同期操作であるため、処理データはバッチであり、プログラムはバッチでtransformにデータを送信し、バッチが処理されてからターゲットファイルに書き込む.したがって、読み出された個数indexは、書き込み済みファイルの個数よりも大きいことが多く、書き込み済みファイルの個数をどのようにキャプチャするかについては、後で処理される.
'end' 1つのファイルを処理した後にトリガーされるイベント.
'error' データの処理中に、異常トリガのイベントが発生します.
'close'ファイルが閉じたときにトリガーされるイベント.
 
詳細:
         csvモジュールの高度な点は、行ごとにデータを読み取ることであり、読み込まれたデータはオブジェクトの形式であり、列名はオブジェクトのkeyであり、値はvalueであり、このように各列の値を取るのは非常に簡単になり、c++のようにフィールドを解析したくないことである.
.from.path(strSrcPath, {header: true, columns: true})
fromメソッドの2番目のパラメータ設定は列を分離します.
処理後のデータを新しいファイルに書き込む場合は、パラメータを設定することもできます.
        .to.path(strDestPath,{
            header: true
            ,lineBreaks:'windows'
            ,newColumns: true
            ,end: false
            ,columns:fields
            ,flags : 'w'
        })
 
各パラメータについて説明します.
       *   `delimiter`   csvファイルの各列の区切り記号;
*   `columns`    ターゲットファイルターゲットファイルの列、
*   `header`     ヘッダーがあるかどうか.
      *    `lineBreaks`  行間を区切る識別子、 'Auto','unix','mac','windows','unicode'のいくつか;
      *   `flags`       新規ターゲットファイルは既存のターゲットファイルにデータを追加するか、’w’新規;’a’追加;
      *   `end`        endメッセージに応答する前に、ファイルは書き込み不可です.
 
csvブレークポイント継続
         このcsvモジュールの唯一の欠点は、1つのファイルが処理されていないというブレークポイントをサポートできないことです.次に処理します.この問題を解決する鍵は、プログラムが処理したデータの数をキャプチャすることです.前述した'cord'は、ファイルに書き込まれた数ではなく、プログラムが読み取った数だけをリスニングできます.csvモジュールのソースコードを追跡すると、ソース世代を変更すればコードは、ターゲットファイルに一括して書き込まれるたびにイベントが傍受され、問題が解決されます.
this.emit("writen", this.state.countWriten);
csv.jsにカスタムリスニングイベントを追加します.countWritenは、ターゲットファイルに書き込まれるたびに記録される数です.csvモジュールを呼び出すときにこのイベントを追加します.
        .on('writen', function(index){
            console.log("rtn", index);
        })
これにより、書き込みファイルの数をリアルタイムでキャプチャでき、カーソルファイルに書き込むことができます.少し修正すると、csvモジュールはブレークポイントの機能をサポートし、完璧に使用できます.