CでCSVファイルを読み取る方法

CSVファイルを提供しているプログラムのドキュメントを参照してください。 各行のフィールド数と各フィールドの形式を決定します。 たとえば、プログラムが次のデータを含むCSVを提供する場合:1、 "test"、34.5 3つのフィールド(1つの整数、1つの文字列、および1つの浮動小数点数)をマークダウンします。

CSVで識別された各フィールドのデータメンバーを含む構造を作成します。 提供されている1、 "test"、34.5の例の行を使用すると、次の構造が必要になります。structdata {int col1; char * col2; float col3; };

CSVファイルの読み取りを処理するメソッドをプログラムに作成します。 これは、プログラムの残りの部分からアクセスできる必要があり、他のメソッドが読み込まれたデータにアクセスできるように、一般的なデータ構造で作業する必要があります。 戻り値の必要性をなくすために、参照によってパラメーターを渡します。 関数プロトタイプの例は次のとおりです。voidParseCSV(char * filename、data&input);

次のコードを使用して、データを読み込むファイルオブジェクトを作成します。FILE* pInput;

一度に1行のファイルを保持するのに十分な大きさの文字バッファを作成します。 言語の制約により、これを行う最も簡単な方法は、次のように、十分に大きなサイズの文字配列を宣言することです。#define BUFFER_SIZE 1024

次のコードでファイルを開き、以前に作成したFILEオブジェクトに割り当てます。pInput= fopen( "filename、" "r")

fgets(buf、sizeof(buf)、pInput)

関数「strtok」を使用してCSVを解析します。 トークンを指す新しい文字列を作成し、上記で読み取った行のデータで初期化します。char* tok = strtok(buf、 "、")

受信したトークンを適切なデータに変換します。 次の行の例を使用します:1、 "test"、3.45次のコードを使用して、 "tok"に含まれるデータを整数に変換します。row.col1= atoi(tok);

同じ行からの後続の読み取りでは、前に読み込んだバッファ文字列の代わりに「strtok」にNULLパラメータを渡します。tok= strtok(NULL、 "、")次に、トークンを適切なデータ型に変換します。 例の行1、 "test"、3.45を使用すると、1行の解析コードは次のようになります。char* tok = strtok(buf、 "、"); row.col1 = atoi(tok); tok = strtok(NULL、 "、"); row.col2 = tok; tok = strtok(NULL、 "、"); row.col3 = atof(tok);

CSVの各行のすべてのエントリに対してこれを実行します。 関数「strtok」は、バッファー内のデータがなくなるまでコンマ値の間にデータを提供し続け、その時点でNULLを返します。 これは、ラインが終了したことを示します。

警告

エラーが発生した場合、関数「fopen」はNULLを返す場合があります。使用する前にファイルを確認してください。 場合によっては、提供されるトークンが期待される形式ではないことがあります。 一般的なエラー値(空の文字列、NULLなど)をチェックして、やみくもに変換する前に、必ずデータを調べてください。