1. カメラ
  2. カーオーディオ&エレクトロニクス
  3. ホームオーディオ
  4. パーソナルオーディオ
  5. テレビ
  6. スマートホーム
  >> 電子技術オンライン >  >> スマートホーム >> スマートライフ

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

数値と計算を扱う多くのソフトウェア製品には、データをカンマ区切り値 (CSV) ファイルに出力する機能があります。この形式は、読み取り可能で操作がかなり簡単なため、異なるプログラム間でデータを転送する効果的な方法となります。データを扱う多くの C プログラムは、ある時点で CSV ファイルから読み取る必要があります。

ステップ 1

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

ステップ 2

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

ステップ 3

プログラムで、CSV ファイルの読み取りを処理するメソッドを作成します。これは、プログラムの残りの部分からアクセスできる必要があり、他のメソッドが読み込まれたデータにアクセスできるように、共通のデータ構造で作業する必要がある可能性があります。パラメーターを参照渡しして、戻り値の必要性を取り除きます。 .関数プロトタイプの例:void ParseCSV( char *filename, data&input );

ステップ 4

次のコードを使用して、標準 IO ヘッダーを含めます。 #include このコードを、CSV を読み取るソース ファイルの先頭に追加します。

ステップ 5

次のコードを使用して CSV データを操作できるようにするには、文字列ライブラリを含めます。 #include このコードを、CSV を読み取るソース ファイルの先頭に追加します。

ステップ 6

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

ステップ 7

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

char buf[BUFFER_SIZE];

ステップ 8

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

ステップ 9

次のコードを使用して、ファイルの行を読み取ります:

fgets(buf, sizeof(buf), pInput)

ステップ 10

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

ステップ 11

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

ステップ 12

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

ステップ 13

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

ヒント

データ変換を別のメソッドにカプセル化して、コードを読みやすくします。ファイルが完全に読み込まれると、「fgets」メソッドは NULL を返します。これを while ループで使用して、ファイル全体をトラバースします。

警告

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