部分的にダブルクォーテーションで括られたCSVファイルを整形したい

部分的にダブルクォーテーションで括られたCSVファイルを整形したい。
具体的には、
aaa,bbb,”ccc,ccc”,ddd,”eee,eee”

aaa,bbb,ccc ccc,ddd,eee eee
のようにしたいです。
アフィリエイトサイトのデータをCSVで落としてくると、

まれにこういった形式になっていることがありますね。

せっかく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化


続きは、ログインもしくは、登録してください



このページの先頭へ