[XML] xsltprocを使って、XMLをCSVに変換する

xsltproc

XMLをDBのテーブルに格納したい時はDBのツールを利用するために、一旦CSVに変換したくなる。
XMLからCSVへの変換っていうと、プログラムを組まなきゃって思うけど、xsltprocを使うとXSLTファイルで変換マッピングを作ってあげれば、シェルからでも変換処理ができる。

http://xmlsoft.org/XSLT/xsltproc.html

フラットな構造をCSVに展開する

まずはそのままCSVに展開できそうなフラットなデータ構造の場合を考えよう。

[Java,C] 浮動小数点での丸め誤差の例

floatやdoubleといった浮動小数点数で計算をしていると、丸め処理をしているつもりでも誤差が出ることがある。
これの簡単な例がないかなぁと思っていたんだけど、 0.35 * 3.0 でうまく表現できそう。

Javaで 0.35 * 0.3 を計算してみる

Javaのdoubleで 0.35 * 0.3 を計算してみると

System.out.println(0.35 * 3.0);
// 1.0499999999999998

[bash] IFS(Internal Field Separator)について

シェルスクリプトでreadを使う時にフィールド分割したくない場合やフィールドの区切り文字を変えたい場合なんかにIFSの値を変えたりする。
でも、実際にIFSの値を変えるとどこまで影響があるんだろうか?

read

これが最も一般的な使い方だと思う。
例えば、IFSが明示的に設定されていない場合は <空白><タブ><改行> が区切り文字になるので、入力に空白があると行が区切られて変数に格納される。

[linux] grepでファイル単位の検索条件

grepを使うときは基本的に1行の中のパターンを検索するし、たいていの場合はそれで問題ない。
でも、たまに条件に合致するファイルを抽出する必要がでてきたりするよね。
行単位ではなく、ファイル単位での検索条件を考えてみよう。

準備

今回、試したのはGNU grep。
また、確認用のファイルとしてtest1,test2,test3を用意する。

[unix] 標準出力の接続先によって、動作を変える

[unix] パイプ処理時のバッファリングではgrepやsedに出力のバッファリングオプションがオプションがあるのを見た。
他にも出力先によって、動作が変わるコマンドはある。

lsの出力

例えば、lsも出力先が端末だと、ファイル名を適当に区切って並べてくれるけど、出力先がパイプだと、ファイル名を縦に並べる。
むしろ、縦に並べる方が本来で、端末の場合は見やすくしてくれていると考えた方がいいかもしれない。

[unix] パイプ処理時のバッファリング

xargsで出力を遅延させる

フィルタの役割をするコマンドは大抵バッファリングするので、teeとかでデバッグしていると、フィルタリングされたテキストがすぐに端末に表示されないことがある。
何かバッファリングの効果を目に見えるように再現できるいい方法はないかなと思ってやってみたけど、xargsを使って、無理やり出力を遅延させるのがわかりやすいかなぁ。

例えば、これだとコマンド実行の2秒後に"2"が表示される。
$ seq 10 | xargs -I% sh -c 'sleep 1; echo %' | grep 2
2
$

[sed] sedのホールドスペースの練習

[awk,Ruby,C#,Java]いくつかの言語でフィボナッチ数生成でawkとかを使ってフィボナッチ数列を生成したけど、sedでこれができないかなーと思ってやってみた。

sedでフィボナッチ数列生成

sedは数値演算を直接サポートしていないので、文字列の長さを数字とみなしてみる。