JavaScript で CSV をテンプレートにあわせて 1 行 1 ファイルに変換

例えば以下のような CSV から

title,date,text
Convert CSV into some files,2013-04-12,How to convert each record in CSV to...
Sample script,2013-04-11,Here is the sample script that you want...

以下の様なテンプレートを使って

<html>
<head>
    <title>{{title}}</title>
</head>
<body>
    <h1>{{date}} {{title}}</h1>
    <p>{{text}}</p>
</body>
</html>

以下のようなファイルを生成するスクリプト(各行につき 1 ファイル)を書いた。自分以外に必要とする人がいるか分からないが。。。

<html>
<head>
    <title>Convert CSV into some files</title>
</head>
<body>
    <h1>2013-04-12 Convert CSV into some files</h1>
    <p>How to convert each record in CSV to...</p>
</body>
</html>

Node.js と mu、fast-csv モジュールを使う。

$ npm install mu2
$ npm install fast-csv

convert.js

var mu  = require('mu2');
var csv = require('fast-csv');
var fs  = require('fs');

var jsondata = [];
var contents = [];
var datafile = 'data.csv';
var template = 'template.html';
var outfile  = 'page';

csv(datafile, {headers: true})
.on('data', function(data){
    jsondata.push(data);
})
.on('end', function(){
    for (var i=0, l=jsondata.length; i<l; i++) {
        render(template, jsondata[i], i);
    }   
})
.parse();

function render (template, data, contentIndex) {
    contents[contentIndex] = "";

    mu.compileAndRender(template, data)
    .on('data', function(output){
        contents[contentIndex] += output.toString();
    })
    .on('end', function(){
        fs.writeFileSync(outfile+'_'+contentIndex+'.html', contents[contentIndex]);
    });
}

ちょっと必要になったので作ってみた。そして後で少しいじって使うかもしれないので、メモとして残してみた。

Advertisements
JavaScript で CSV をテンプレートにあわせて 1 行 1 ファイルに変換

Mac の Chrome で https のページ上で bookmarklet を使う

Chrome ではセキュリティの関係で https のページでは bookmarklet が動かない。Windows だとショートカットにオプションをつけてあげれば良いが、Mac だと同じようにはできない。

そこで以下のようにファイルを作りアプリっぽい形にしてみた。

chrome(insecure).app/
 +- Contents/
     +- MacOS/
     |   +- OpenChrome.sh
     +- Resources/
     |   +- app.icns
     +- Info.plist

OpenChrome.sh

#!/bin/sh
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' --allow-running-insecure-content

Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>OpenChrome.sh</string>
    <key>CFBundleIconFile</key>
    <string>app.icns</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
  </dict>
</plist>

app.icns は、適当に検索して IconArchiveから Chromium Icon を拾ってきて使っている。

Mac の Chrome で https のページ上で bookmarklet を使う