たとえば次のような3つのリストデータがあるとき
aaa bbb ccc |
% join "aaa bbb ccc" , aaa,bbb,ccc |
% split [join "aaa b,bb ccc" ,] , aaa bb b ccc |
ところが,Tcl にはこの機能がないのです.
(※拡張パッケージが存在してました.下のリンクを参照下さい.ただし Tcl8.3 以上が必要のようです)
しゃーないので,CSV データとリスト間の変換プロシージャを書いてみました.csvsplit と csvjoin というコマンドです.プロシージャ名は下の am0250 から頂きました.
proc csvsplit {val} { regsub -all {""} $val "\3" val while {1} { if {[regsub {("[^",]+),([^"]+")} $val "\\1\5\\2" val]<=0} break } foreach x [split $val ,] { regsub -all "\3" $x {"} x regsub -all "\5" $x "," x regsub {^"(.*)"$} $x {\1} x lappend xx $x } return $xx } proc csvjoin {val} { if {[regsub -all {"} $val {""} val]<=0} break foreach x $val { if {[regexp "," $x]} {set x "\"$x\""} lappend xx $x } return [join $xx ,] } |
% set aaa {123,"123,521.2","Mary says ""Hello, I am Mary"""} 123,"123,521.2","Mary says ""Hello, I am Mary""" % puts org:$aaa ;# 元データ org:123,"123,521.2","Mary says ""Hello, I am Mary""" % puts spl:[join [csvsplit $aaa] |] ;# splitデータ spl:123|123,521.2|Mary says "Hello, I am Mary" % puts joi:[csvjoin [csvsplit $aaa]] ;# そのjoin joi:123,"123,521.2","Mary says ""Hello, I am Mary""" |