◆◇◆ Tips! ◆◇◆

CSVファイルの操作

[Japanese Pocket C User's Page]-[Tips!]


作業を行う為のファイルの形式として、CSVファイルは非常に一般的です。
そこで、CSVファイルを操作するプログラムのサンプルを作ってみました。

1.必要とされる機能

まずは、CSVファイルを操作するときに、必要と思われる機能を列挙してみました。

1)ファイルの入出力
これは、以前に紹介したfiletools.pcを使えばある程度簡単に出来ますね。

2)項目の分割
ファイルから、文字を1列づつ読み出したら、
今度は、その文字列を","ごとに分割する必要があります。
ちょっとややこしいかもしれません。

項目の分割さえ出来れば、あとは、分割結果で計算をするなり、
画面に表示するなりできますよね。

 

2.文字列を操作する関数群

CSVファイルを操作する上で複雑と思われる、項目の分割をしてくれる関数群
を作りました。ライブラリにstring.pcとして公開しておきました。

この中で、CSVのために利用できると思われる関数は次の通りです。

・文字列に含まれる特定の文字の数を数える countchar(string str_source,char seek_char)

この関数を使って","の数を数えれば、1行に含まれる項目数が分かります。

・右から特定の場所の項目を呼び出す rightget(string str_source,char sep_char,int div_count)
・左から特定の場所の項目を呼び出す leftget(string str_source,char sep_char,int div_count)

この2つの関数を1行づつ読み出した文字列に対して操作を行えば、CSVファイルを読み出せます。

 

3.サンプルプログラム

ということで、CSVファイルを操作するサンプルを作りました。
string.pcのサンプルとして、配布しています。

このプログラムでは、もとのCSVファイルの一番左の項目と、
右から3つめの項目だけを抽出して、別のファイルに保存しています。

(プログラム名:csv.pc)


// ******************************
// csv ファイルの操作のサンプル
// 
// written by まつし 2000/09/19
// ******************************

// Step 0 必要なファイルのinclude
#include "/pocketc/pcheader.h"		// お約束
#include "/pocketc/filetools.pc"	// ファイル操作簡略化関数
#include "/pocketc/strings.pc"		// 文字列操作補助関数群

main()
{
// Step1 初期設定
string csv_from;	// 読出元ファイル
string csv_to;		// 書込先ファイル
int from_handle;	// 読出元ファイルを示すファイルハンドル
int to_handle;		// 書込先ファイルを示すファイルハンドル
int count_column;	// 項目数
string work_str;	// 読出文字列
string write_str;	// 書込文字列

// Step2 対象ファイルの指定
csv_from=OpenFileDlg("csv (*.csv)|*.csv");
csv_to=SaveFileDlg("csv (*.csv)|*.csv");
putsl("From "+csv_from);
putsl("To "+csv_to);
graph_off();

from_handle=fileopenex(csv_from,FILE_READ);
to_handle=fileopenex(csv_to, FILE_CREATE|FILE_WRITE);

// Step3 先頭行の処理
// 1)項目数が3未満は終了
work_str=readln(from_handle);
count_column=countchar(work_str,",");	//←文字数をカウント

if (count_column<3)
	{
	putsl(" few columns!");	
	return;
	}

// 2)ヘッダーの書込
write_str=(leftget(work_str,",",1)+","+rightget(work_str,",",3));
// 一番左と、右から3つめを出力
putsl(write_str);
writeln(to_handle,write_str);

// Step4 各行の処理
while(eof(from_handle)==0)
	{
	work_str=readln(from_handle);
	if(count_column!=countchar(work_str,","))
		{
		putsl("row mismatch"+work_str);
		}
	else
		{
		write_str=(leftget(work_str,",",1)+","+rightget(work_str,",",3));
		putsl(write_str);
		writeln(to_handle,write_str);
		}
	}
fileclose(from_handle);
fileclose(to_handle);
putsl(" ----- end ----- ");
}

4.サンプル解説

プログラムは、次のような流れになってます。

Step0 必要なファイルのinclude

各種ライブラリのinclude。該当ファイルを/pocketcディレクトリに用意しておいてくださいな。

Step1 初期設定

各種変数の宣言をしてます。

Step2 対象ファイルの指定

ファイルダイアログを利用して、入力用ファイルと出力用のファイルを指定。

Step3 先頭行の指定

ヘッダを読み出しています。
この時点で項目数が3より少なければエラーとして終了します。

Step4 各行の処理

各行を読み出し、順次一番左の項目と、
右から3つめの項目だけを抽出してファイルに出力

文字列操作関数群を使ったので、
プログラムは比較的シンプルになったと思います。

この内容を理解できれば、CSVファイルに対する操作方法が理解できるはずです。


[Japanese Pocket C User's Page]-[Tips!]