#navi(../)
* 固定長文字列データをCSVに変換する・sed [#t6d4d55f]
固定長文字列データをcsvに変換したい場合は、sedを使用すると簡単に実現することができます。~
尚、本資料の例では、対象データが固定長で1レコード毎に改行があることを想定しています。

#contents
#htmlinsertpcsp(linux_ads_top.html,linux-sp.html)

* 関連資料 [#d275c3c6]
-[[指定した文字数(byte)で改行する・fold>逆引きUNIXコマンド/指定した文字数(byte)で改行する・fold]]


* 使用した固定長文字列データ [#xa2c75f7]
以下に記す固定長の文字列データを使用しました。~
#ref(fixlen.dat)
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890
 123456789012345678901234567890


* 各項目の長さを指定しカンマ区切りで出力 [#l9c5e7b0]
以下の例では、2、4、6と残りで区切りCSVとして出力する例です。
 $ cat fixlen.dat | sed -e 's/^\(.\{2\}\)\(.\{4\}\)\(.\{6\}\)/\1,\2,\3,/g'
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890
 12,3456,789012,345678901234567890

** タブ区切りにしたい場合 [#o091d9ec]
タブ区切りにしたい場合は以下のようになります。
 $ cat fixlen.dat | sed -e 's/^\(.\{2\}\)\(.\{4\}\)\(.\{6\}\)/\1\t\2\t\3\t/g'
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890
 12	3456	789012	345678901234567890

** ダブルクォートで囲みたい場合 [#p7c37c23]
ダブルクォートで囲みたい場合は、以下のようになります。
 cat fixlen.dat | sed -e 's/^\(.\{2\}\)\(.\{4\}\)\(.\{6\}\)/"\1","\2","\3","/g' | sed -e 's/$/"/g'
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"
 "12","3456","789012","345678901234567890"

* sedの動作について [#ld9f2aa8]
今回、指定した値で文字を区切り、カンマを挿入しました。~
sedでは、文字数は以下のうに記します。
 .\{数字\}
これで、数字文の文字になります。

次に取得した文字を左辺で記すには以下のような約束事があります。
 \(条件\)
今回の例では、以下の部分になります。
 \(.\{2\}\)\(.\{4\}\)\(.\{6\}\)
括弧()で囲んだ部分を左辺では、\1 \2 \3 と記述します。~
1番目は\1、二番目は\2のように記述します。~
今回の例では以下の部分になります。
 \1,\2,\3,

以上、sedを使って固定長文字列をCSVに変換する方法でした。

#htmlinsertpcsp(linux_ads_btm.html,linux-sp.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS