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ファイルに対する操作方法が理解できるはずです。