bashでhtml作成 | labunixのラボゆにっくす

labunixのラボゆにっくす

Debian [ Lenny | squueze | kfreebsd ] amd64

■bashでhtml作成

 エクセルネタに参加してみる。
 ちなみに。。。

 2007以前のエクセルでは、256(列)×65536(行)が最大【仕様】
 2007以降のエクセルだと、16384(列)×104,8576(行)が最大【仕様】

 参考:めんどうな作業がわずか数秒に!新人デザイナーが 知らないと
     一生後悔するExcelを使ったHTML生成
 http://webrocketsmagazine.com/entry/20111209/html-code-generation-using-excel.html

 参考:僕たちプログラマーは、ちょっとしたコード生成に、Excelを使いません!
 http://d.hatena.ne.jp/takuya_1st/20111217/1324105198

 参考:めんどうな作業がわずか数十秒に!新人プログラマが知らないと
    一生後悔するVimを使ったHTML生成
 http://mattn.kaoriya.net/software/vim/20111215034338.htm

■とりあえず、puttyでもTeraTermでもシェルにコピペできる端末に
 最初のユーザプロンプト「$」を除いてコピペしてみよう。
 ※バッファの最大値は設定に依存。
 ※貼り付けた画像の画質が悪いのはわざとですので、
  今後も画質が向上したりしません。。。

■TITLE変数を設定して、表題を入れたヘッダ処理

$ TITLE=TEST; \
echo '<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>'${TITLE}'</title>
</head>
<body>
<br/><br/><br/><br/><br/>
<div align="center">
<table border="1">' >1.tmp

■1行づつコードを足しながら進める。

 1.sedで行の先頭に<tr><td>をつける
 2.sedで行末に</td></tr>をつける
 3.awkで「,」を</td><td>に変換
   ※インデントはタブを4にしてもよいがタブは環境依存となる点に注意。
   ※列の入れ替えはここで出来る
   ※列の数はバッファを越えなければ良い。
 4.</tr>を改行して整形

$ echo 'ギーク名,得意技
miyagawa,それプラ
tokuhirom,patches welcome
xaicron,lang:mattn
hasegawayosuke,xss
cho45,gerry++' | \
  sed s/"^"/"<tr><td>"/g | \
  sed s/"\$"/"<\/td><\/tr>"/g | \
  awk -F\, '{print $1 "</td>\n    <td>" $2}' | \
  sed s/"<\/tr>"/"\n&"/g > 2.tmp

■フッタ処理

$ echo '</table>
</div>
</body>
</html>' > 3.tmp

■つなげる
 各ファイルはモジュールなので、
 見た目やレイアウトを変えたい場合は
 それぞれ個別に修正する。

$ for num in `seq 1 3` ;do
  cat ${num}.tmp >> index.html
done

■w3mでチェック

$ w3m index.html > test.txt
$ cat test.txt

■csv がファイルなら?
 「はい、コピペします。」

$ cat 0.csv | \
  sed s/"^"/"<tr><td>"/g | \
  sed s/"\$"/"<\/td><\/tr>"/g | \
  awk -F\, '{print $1 "</td>\n    <td>" $2}' | \
  sed s/"<\/tr>"/"\n&"/g > 2.tmp

繰り返すなら保存しても良いけど、
ヘッダもフッタもローカル、外部に関わらず、
サンプルになるhtmlファイルはどこにでも在るはず。

■タブだったら?
 「,」が無い事が前提。

$ cat tab.csv | \
   sed s/"\t"/"","/g > 0.csv

■タブ区切りで「,」があるなら、
 一旦ファイル中に存在しない記号に変換して戻す

$ cat tab.csv | \
   sed s/","/"###"/g > 0.csv

 ※最後に変換する

$ cat index.html | sed s/"###"/","/g > index.htm

■大きめのCSVで試す

$ echo -n "列数:";head -1 0.csv | sed s/","/"\n"/g | wc -l
列数:15

$ echo -n "文字数:"; wc -c 0.csv
文字数:442701 0.csv

$ echo -n "行数:"; wc -l 0.csv
行数:4111 0.csv


■「,」が15以内に収まっているか確認する

$ awk -F\, '{print $16}' 0.csv | grep -v "^\$"

■必ず15列あることを確認する

$ awk -F\, '{print $15}' 0.csv | grep -v "^\$" | wc -l
4111

■入れ替える必要が無ければ、awkの代わりに sed で良い。

$ cat 0.csv | \
  sed s/"^"/"<tr><td>"/g | \
  sed s/"\$"/"<\/td><\/tr>"/g | \
  sed s/","/"<\/td>\n    <td>"/g | \
  sed s/"<\/tr>"/"\n&"/g > 2.tmp