部分的にダブルクォーテーションで括られたCSVファイルを整形したい
具体的には、
aaa,bbb,”ccc,ccc”,ddd,”eee,eee”
↓
aaa,bbb,ccc ccc,ddd,eee eee
のようにしたいです。
まれにこういった形式になっていることがありますね。
せっかくCSVからHPを作成するシステムを作ったのに、
ダブルクォーテーションに括られているパターンを想定していなかったため、
データがうまくDBに取り込めなかったり、エラーが発生してしまうことがあります。
そして、結局CSVを取り込みやすい形に直すために手間取られてしまう・・・。
そんな状況もUWSCで解決できます。
前提として、UWSCの特殊文字についておさえておきましょう。
- <#CR>
- 改行コードを表す
- <#DBL>
- ダブルコーテイションを表す
- <#TAB>
- タブを表す
今回は、カンマとダブルコォーテーションの関係に注目します。
質問のCSVパターンは必ず「,”」で始まり「”,」で括られます。
つまり、「,”」と「”,」に挟まれた文字列を取得し、
その文字列内のカンマ(,)をスペースに置換する作業を繰り返せば良いわけです。
その際に注意しないといけないのは、
ダブルクォーテーションで括られる文字列は、
1行の間に必ずしも1回ではないということです。
無い場合もあるし、複数回ある場合も考えられます。
そこで、IF文とWHILE文を使って対応できるようにします。
これらを踏まえて作成した関数は以下の通りです。
//////////////////////////////// //不要なカンマをスペースに変更する関数 //STR:文字列 //////////////////////////////// FUNCTION CANMA(STR) CNT = 1 IFB POS(",<#DBL>",STR)>0 WHILE POS(",<#DBL>",STR,CNT) BFO = POS(",<#DBL>",STR,CNT) AFT = POS("<#DBL>,",STR,CNT) TGT = COPY(STR,BFO+2,AFT-BFO-2) STR = REPLACE(STR, TGT,REPLACE(TGT,","," ")) CNT = CNT + 1 WEND ENDIF RESULT =STR FEND
解説
CNTは括られた文字列が何個目かを認識します。
最初のIF文の条件で「,”」を検索します。
これにより、括られた文字列のあり無しを判断します。
次のWHILEである限り置換作業を行う命令をします。
その後は一般的な置換作業となります。
TGTを求めるために「+2」「-2」をしているのは、
カンマとダブルクォーテーションの文字数を指しています。
ナカヤマン自身も使っている、CSV置換の構文は以下の通りです。↓↓
CSV整形スクリプト・サンプル:列の削除とカンマ整形とUTF8化