以下のようなデータからsqliteのcreate table時に必要なカラム名と型名のリストを抽出したい
data.csvとしておく
columnA,columnB,columnC,... INT,INT,INT,... 1,2,3,... 11,22,33,... ...
抽出したいのはこれ
columnA INT, columnB INT, columnC INT, ...
まず必要なheader部分を取り出して、転置して、それを一行にすればよさそう
今回はmac上で動けばよいので転置にはrsコマンドを利用
$ cat data.csv | head -n2 | tr , ' ' | rs -T | paste -s -d, -
しかしこれだとカラム数がとても多いデータの場合にうまくいかないことがわかった
試しに確認用のデータをrsで変換してみる
$ seq -s' ' 1 300 | rs -T 1 284 2 285 ... 282 283
こんな結果になった。想定どおりなら300まで一行ずつになるはずが、283の後は2列目に表示された。
数を1000とかに大きくすると、283の行のところでまたさらに次の列に表示されるようになる。
調べてみるとどうやら283の3がちょうど1023文字目になっていることがわかった。おそらく210以上の文字を横に並べては処理できないようになっていると考えられる。なのでちょっと方法を変えることにした。
$ cat data.csv | head -n2 | tr , '\n' | rs -t 0 2 | paste -s -d, -
一度縦にすべてを並べてからそれをrsで2列に並べるよう指定した。これなら数を大きくしてみても欲しかった結果が得られた。
最初のdata.csvを変換してみると以下のような結果になる
columnA INT,columnB INT,columnC INT
間の空白が気になる場合はpasteの後にsedで調整
sed -e 's/[[:space:]][[:space:]]*/ /g'