データファイル作成
-CSV-

■CSV概要

CSV(Comma-Separated Values)ファイルとは値を「,」で区切った
テキストファイルのことです。

tool_0001

「,」区切りでデータの区別ができることと、Excelを使用することで
簡単に作成できることから外部ファイルとしてよく利用されています。

■ファイル作成

CSVファイルの作り方は主にExcelでの作成が主流だと思いますが、
テキストファイルで構成も単純なことから様々な方法で作成が可能です。
ここではExcelによる作成方法を紹介します。
※Microsoft社のMicrosoft Excelを対象に解説しています。

①.Excelを開く
	まずはExcelを起動します。

②.外部データにしたいデータを打ち込む
	CSVファイルにしたいデータをExcelに打ち込みます。
	次の③でCSVファイルとして保存する際は
	必ずA1から作成されますので、その点については注意して下さい。
	
	tool_0002

③.CSVファイルとして保存する
	3-1.Excelファイルとして保存
		上段メニュー「ファイル」 => 名前を付けて保存 => 
		ファイルの種類の選択で「Excelブック(*.xls)」として保存します。
		CSVファイルとして保存する前にExcelとして保存しておいたほうが
		編集を行う場合などで何かと都合が良いです。
		※Excelのバージョンがかなり古いのでxlsしかありませんが、
		 「xlsx」ファイルでも問題ありません。
		
		tool_0003

	3-2.CSVファイルとして保存
		xlsとして保存が完了したら再度上書き保存を選択して
		ファイルの種類の選択で「CSV(カンマ区切り)(*csv)」を選択して保存します。
		その後警告がいくつか出ますが、全てはいを選択して下さい。
		※上書き保存するかの警告についての選択はきちんと自分で判断して下さい。
		
		tool_0004

●作成時の注意点
	ExcelによるCSVファイルの作成の縦横の数は最大数で固定されます。
	例えば以下のSSのように縦と横のデータ打ち込みに空きがある場合、
	Excelは行と列の最も端にあるデータの位置を最大とします。
	このデータでは行(横)がJ(10)、列(縦)が最大となります。
	
	tool_0005
		
	上のデータをCSVファイルとして保存した内容が以下のSSです。

	tool_0006

	このように空白だった部分は何も設定されていません。
	データを使用する際にこの形式でも問題でるようなら
	打ち込みの際に空白がないように入力して下さい。

■CSVファイルの読み込み

CSVファイルの読み込みは1行に設定するデータが固定されている方が適しています。
もし、マップデータのようなステージ毎にマップのサイズが変わるデータは
VBAなどを使用してデータを作成した方が読み込みは楽です。
今回はCSVで設定した個人情報データを読み込みたいと思います。

●データ例
	敵のパラメータ
	アイテムパラメータ
	レベルパラメータ等

●使用データ
	使用するデータは以下のデータを使用します。
	tool_0007
	
●ソース
	#include <stdio.h>
	#include <stdlib.h>
	#include <memory.h>

	// 個人情報データ
	struct PersonalData
	{
		char m_Name[32];	// 名前
		int m_Age;			// 年齢
		int m_Height;		// 身長
		int m_Weight;		// 体重
	};

	void main(void)
	{
		FILE *fp = NULL;
		PersonalData *list[100];

		int size = sizeof(PersonalData*);
		memset(list, 0, sizeof(PersonalData*) * 100);

		// CSVファイルオープン
		fopen_s(&fp, "TestCsv.csv", "r");
		if (fp == NULL)
		{
			return;
		}

		PersonalData data;
		int count = 0;

		// 読み込み開始
		while (fscanf_s(fp, "%[^,],%d,%d,%d\n", &data.m_Name, 32, 
							&data.m_Age, 
							&data.m_Height, 
							&data.m_Weight) != EOF)
		{
			// 取得データを保存
			PersonalData *pdata = (PersonalData*)malloc(sizeof(PersonalData));
			*pdata = data;
			list[count] = pdata;
			count++;
		}

		// ファイルクローズ
		fclose(fp);

		// 読み込みできたか確認
		for (int i = 0; i < count; i++)
		{
			printf("Name = %s Age = %d Height = %d Wight = %d\n", 
								list[i]->m_Name, 
								list[i]->m_Age, 
								list[i]->m_Weight, 
								list[i]->m_Weight);
		}

		// 確保したメモリを解放
		for (int i = 0; i < count; i++)
		{
			free(list[i]);
		}

		while(true);
	}

●fscanf_s
	戻り値:
		成功:変換を行ったデータの個数
		失敗:EOF(-1)

	引数:
		第一引数:
			FILE *:ファイルポインタ

		第二引数:
			char *:読み込む文字列の構成

		第三引数以降:
			変換したデータを保存する変数

	内容:
		fscanf_s関数は一行単位でファイルを読み込んでくれる関数です。
		読み込みの際に行の構成を指定することで整数や文字列などのデータを
		変数に格納することが可能です。

	例:
		取得データ
			鈴木一郎,20,170,54

		使用例:
			fscanf_s(fp, "%[^,],%d,%d,%d\n", &data.m_Name, 32, 
								&data.m_Age, 
								&data.m_Height, 
								&data.m_Weight)

		取得結果:
			data.m_Name => 鈴木一郎
			data.m_Age => 20
			data.m_Height => 170
			data.m_Weight => 54

	・文字列変換についての注意
		文字列は本来「%s」で変換を行いますが上記の使用例では
		%[^,]となっています。
		なぜこのような形になっているかというと%sで取得した場合、
		「,」を含めて全て文字列としてデータ変換を行ってしまいます。
		上の使用例の場合では「m_Name」に「鈴木一郎,20,170,54」が全て入ることになります。
		この現象を防ぐために「%[,]」を使用しています。
		[^,]は「^」以降の文字(今回は,)以外の文字列を読み込むという指定です。
		これで「,」を変換対象の文字ではなく、区切り文字の「,」として
		認識できるようにしています。