動機
40個くらいのCSVを何回か処理しなくてはならなくなったため。
GASでは遅いのでPythonとかでやった方が明らかに良い。とは言いつつ日頃からGAS触ってるのとファイルのデータを扱えるとGASでできることが広がると思ったので書きました。
イメージ
たくさんあるCSVファイルの内容を読み取って全てに同じ処理を適用して一つのファイルにまとめる
GAS
CSVしか入っていない特定のフォルダからファイルをすべて読みこんで配列に変換。適当に処理して書き出す。
function main() {
const id ='フォルダーID'
const folder = DriveApp.getFolderById(id);
const files = iteratorToArray(folder.getFiles()).sort();
const arrs = files.map(csvToArray)
const results = arrs.map(function(arr,id) {
//ここに処理を書く
});
const result = results.reduce(function(pre, cur) {
return pre.concat(cur);
},[]);
setDataToTempSheet(result)
}
//CSVファイルを2次元配列に変換する、文字コートは要調整
function csvToArray(file) {
const csv = file.getBlob().getDataAsString("Shift_JIS");
return Utilities.parseCsv(csv);
}
//イテレータを1次元配列にする
function iteratorToArray (iterator) {
var result = [];
while (iterator.hasNext()) {
result.push(iterator.next());
}
return result;
}
//テスト用のスプレッドシートに結果を吐き出す。
function setDataToTempSheet(data) {
const id = 'スプレッドシートID';
const ss = SpreadsheetApp.openById(id);
const sheet = ss.getSheets()[0];
sheet.getRange(1,1,data.length,data[0].length).setValues(data);
}
処理例
const results = arrs.map(function(arr,id) {
//5列目にデータがある
const data = arr.map(function(a) {
return Number(a[4]);
});
//実効値を求めるすべての要素を2乗してそれらを平均して0.5乗する。avg,squareは自前の関数
const result = Math.pow(avg(data.map(square)),0.5);
return [[files[id].getName()],[result]]
});
最初の画像のような結果が出る。CSVの5列目のデータを取り出して全体の実効値を求める。ファイル名がわからないと判別できなかったので最後にファイル名を実行値と一緒に返す。
数値は文字列として読み込まれるので数字に変換しとくこと。