proc csv2list {str {sepChar ,}} {
regsub -all {(\A\"|\"\Z)} $str \0 str
set str [string map [list $sepChar\"\"\" $sepChar\0\" \"\"\"$sepChar \"\0$sepChar \"\" \" \" \0 ] $str]
set end 0
while {[regexp -indices -start $end {(\0)[^\0]*(\0)} $str -> start end]} {
set start [lindex $start 0]
set end [lindex $end 0]
set range [string range $str $start $end]
set first [string first $sepChar $range]
if {$first >= 0} {
set str [string replace $str $start $end [string map [list $sepChar \1] $range]]
}
incr end
}
set str [string map [list $sepChar \0 \1 $sepChar \0 {} ] $str]
return [split $str \0]
}
proc list2csv {list {sepChar ,}} {
set out ""
foreach l $list {
set sep {}
foreach val $l {
if {[string match "*\[\"$sepChar\]*" $val]} {
append out $sep\"[string map [list \" \"\"] $val]\"
} else {
append out $sep$val
}
set sep $sepChar
}
append out \n
}
return $out
}