CSVファイルの改行の削除について

改行のあるカンマ区切りのCSVファイルから、 改行をすべて削除するプログラムを作りたいのですが、 改行が削除できません。
checkfile	="test.csv"
fid= FOPEN(checkfile,F_READ or F_WRITE8)
FOR col = 1 to FGET(fid, -1) //行数分
	linestr= FGET(fid, col)
	linestr= TRIM(linestr,TRUE)
	linestr= REPLACE(linestr, "<#CR>", "") 
	FPUT(fid,linestr,col)
NEXT
FCLOSE(fid)
改行コードは以外にもあるようですが、 、も試してみましたが、 削除できませんでした。 方法はありますでしょうか? よろしくお願い致します。

タグ

2012年6月12日 | コメント/トラックバック(3) |

カテゴリー:掲示板

ファイル書き込み

ファイル書き込み
FPUT( ファイルID, 書込み値, [行, 列] )

引数
・ ファイルID・・・FOPENで取得したファイルID
・書込み値・・・ファイルに書き込む値
・行・・・書込み行(1から指定)、0で行末に追加。
F_ALLTEXTを指定した場合は行ではなくファイルの全内容として書き込む
・列・・・書込み列(1から指定)
カンマ区切りのCSVファイルに対応
F_INSERTを指定した場合は指定行に挿入
※書き込み内容の反映はFCLOSEの実行時

ファイルに値を書き込む

ファイルを開き、値を書き込む
こういった処理はよくありますが、FOPENでのファイルオープンや、
FCLOSEによるファイルクローズと言った手続きを忘れてしまいがちです。
下記はファイルに値を書き込むシンプルなスクリプトの例です。

//C:\temp.txtに日付を記入したファイルを作成
FNAME = "C:\temp.txt"
DOSCMD("echo %DATE% %TIME% > " + FNAME)
//ファイルをオープン
ID = FOPEN(FNAME,F_READ or F_WRITE)

//ミリセカンドまで含めた時間を10回書き込む
FOR A = 1 TO 10
GETTIME()
NOW = G_TIME_YY + "/" + G_TIME_MM + "/" + G_TIME_DD + " " + G_TIME_HH + ":" + G_TIME_NN + ":" + G_TIME_SS + "." + G_TIME_ZZ
FPUT(ID,NOW)
NEXT

//最後にファイルクローズ
FCLOSE(ID)

//中身を確認した後、ファイル自体は削除
DOSCMD("notepad " + FNAME)
DOSCMD("del " + FNAME)

CSVファイルの指定位置に値を書き込む

次にFPUT関数の様々な引数を利用し
CSVファイルの指定位置に情報を書き込んで見ます。
サンプルでは3行のカンマ区切りのファイルの中で、
3行目の4つ目の値を対象にしています。 スクリプトは下記のようになります。

この投稿の続きを読む »

タグ

2012年5月24日 | コメントは受け付けていません。 |

カテゴリー:逆引き関数

部分的にダブルクォーテーションで括られた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化

この投稿の続きを読む »

タグ

2012年4月4日 | コメントは受け付けていません。 |

カテゴリー:Q&A

このページの先頭へ