前提・実現したいこと
3つのファイルの中身をクラウドストレージから取ってくる(createReadStream必須)
->条件に一致した行を抽出
->配列にまとめる
->console.logで出力
該当のソースコード
var now = new Date(); var year = now.getFullYear(); //年 var month = now.getMonth()+1; //月 var cloud = ["cloud1","cloud2","cloud3"]; const Index = "定期バッチ結果"; const body = []; const {Storage} = require('@google-cloud/storage'); const srcBucketName = "定期バッチの結果用"; cloud.forEach(function( value ) { console.log( value ); var fs = require('fs'); var readline = require("readline"); const srcFilename = value+"_bench_"+year+"_"+month+".txt"; const srcStorage = new Storage({ projectId: "demo" }); const srcBucket = srcStorage.bucket(srcBucketName); const srcRemoteFile = srcBucket.file(srcFilename); const file = srcBucket.file(srcFilename); var stream = srcRemoteFile.createReadStream(); var reader = readline.createInterface({ input: stream }); var tmpscore = new String(); //1行ずつ読み込み、特定の行を抽出 reader.on("line", (data) => { tmpscore = data.match(Index); if (tmpscore){ var score = tmpscore.input.replace(/hogehoge/g,""); return body.push(value+" "+score); // console.log(body); } }); // console.log(body); }); console.log(body);
試したこと
reader.onの中とforeachの中と外でconsole.logでbodyを表示したところ、
readerの中でしか値が取れていない
console.logの表示順がforeachの中でreader.onの外->foreachの外->reader.onの中の順だった
補足など
console.logの表示順がおかしいため、jsでよくある同期・非同期の問題かと思うのですが、reader.onで使う値がforeachの値のため、非同期でどうやってreader.onの結果をforeachの外に出すか設計ができずに困っています。
foreachを諦めて1つずつpromizeとかasyncを使って並べれば簡単かと思いますが、スマートとは言えません。。。
また、ファイルを一旦ローカルに落としてreadする方法もありますが、使用するサービスがPaasのため書き込み出来るディレクトリが無く、streamでしか処理できません。
node.jsは6系希望です。
$ node -v
v6.14.4
以上よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー