[UE4] CSVファイル出力機能が用意されている箇所について

# みんな大好きCSV！ 
UE4には様々な箇所にCSVファイル出力機能が用意されており、これらを活用することでデータ管理・確認・比較作業などを効率よく行うことができます。
ということで、どんな箇所に用意されているのかをご紹介します（数が多いので全ては紹介しません！）
# DataTable・CurveTable
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/a0a3ff48-0689-b84c-67d9-8cc9e0b85748.png)
UE4でCSVといったらまず思いつくのがDataTable！アセットの右クリックメニューから入出力が可能です。
https://docs.unrealengine.com/ja/Gameplay/DataDriven/index.html
また、類似の機能である **CurveTable** でも同様の操作が可能です。
http://historia.co.jp/archives/1067/

# StringTable
![StringTables-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/df34bcde-d59f-a58b-e11d-4879409e8709.jpeg)
テキストのローカライズ管理で使用するStringTable(文字列テーブル)でもCSVファイルの入出力が可能です。
https://docs.unrealengine.com/ja/Gameplay/Localization/StringTables/index.html

ちなみに、先日ローカライズに関する勉強会が開催されました！StringTableの使い方だけでなく様々な有益情報が公開されていますのでぜひご確認ください！
https://www.unrealengine.com/ja/blog/localization-deep-dive

# SAssetView
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/8b3438b3-e7bf-5bbe-ca29-7e6bbeaf8c71.png)
SAssetViewで実装されたウィンドウのView 右下にあるView TypeがColumnの場合、Options-> Export to CSVからCSVファイルを出力できます。
コード：```SAssetView::GetViewButtonContent()```, ```SAssetView::ExportColumns()```

<details><summary>SAssetViewが使われている箇所</summary><div>
**● Content Browser**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/50cac0ad-38ee-e63e-d97d-55178db1ca20.png)
**● Global Asset Picker ( Ctrl + P )** https://docs.unrealengine.com/ja/Engine/UI/GlobalAssetPicker/index.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/9d78907c-8dd9-580e-9712-56885d764efd.png)
**● Asset Audit** https://www.unrealengine.com/ja/tech-blog/optimizing-battle-breakers-for-chunked-downloading
![Unreal+Engine_blog_optimizing-battle-breakers-for-chunked-downloading_ChunkAssetAudit_01-1050x701-417b75a61fa149debe552e55a6eeaa8a79b92fbd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/4135b45a-1e7a-f33c-16be-ab632474334e.jpeg)
**● Asset Browser (Persona)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/597db183-c1d3-a69d-579c-83183d5ac740.png)
**● Asset Picker**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/eb80a0e8-bd9f-796c-b896-f82ece4c450f.png)
**● Save Asset**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/4c22aa4a-2b26-ebc2-dd7b-8f26533d6e0f.png)

この他にも沢山用意されています。右下に「View Options」を見つけたら是非試してみましょう！
</div></details>

# StartFPSChart / StopFPSChart
![fpschart.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/91e704a8-a402-d583-80da-21b826d2e90e.jpeg)
長期間に渡ってstat unitで計測した結果をCSVファイルで出力してくれるコンソールコマンド「StartFPSChart」「StopFPSChart」
https://docs.unrealengine.com/ja/Engine/Performance/Overview/index.html#%E4%B8%80%E5%AE%9A%E6%9C%9F%E9%96%93%E3%81%AE%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B

# CSV Profiler
![image.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F364110%2Fbe89a5e0-935e-c1d0-fccb-7c2ecb0993ab.png?ixlib=rb-1.2.2&auto=compress%2Cformat&gif-q=60&s=72c3b105bb7a9caeada3c57d51450377)
![image.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F364110%2Fa093a3a0-fe88-2446-e0f5-477220fcf674.png?ixlib=rb-1.2.2&auto=compress%2Cformat&gif-q=60&s=d4f5743883d9246d33e4e790753338d9)
様々なパフォーマンス情報をCSVファイルで出力してくれるCSV Profiler。詳細は以下の解説記事にて！
https://qiita.com/EGJ-Ken_Kuwano/items/a6c97a7eda8d69cae6d5
https://docs.unrealengine.com/ja/Engine/Performance/CSVProfiler/index.html

# Automation Report Manager
![ExportTests.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/bde791e9-de1d-9f6f-6138-e459a5775b19.jpeg)
Automation Toolを使って自動化テストをした際の結果をCSVファイルで出力してくれます。日々のチェック、問題が起きた際の比較をする際に便利です！
https://docs.unrealengine.com/ja/Programming/Automation/UserGuide/index.html

# AllChunksInfo.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/0ccf19f5-725b-cc25-c6af-e9f90e0f3d9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/3c92cd8f-dc78-e0e1-d0d9-3d79b7d03c79.png)
プロジェクト設定->Packagingの「Generate Chunksが有効」かつ「Generate No Chunksが無効」の場合、```<PROJECT_ROOT>\Saved\Cooked\<PLATFORM>\<PROJECT_NAME>\Metadata``` 以下に パッケージに含まれる各アセットのChunk ID, Class Type, File Sizeなどの情報を含むCSVファイル AllChunksInfo.csv を出力してくれます。Chunkに関する作業時だけでなくパッケージサイズの削減をする際にも便利かと思います！

# Commandlet
作業の自動化などでよく用いられるコマンドレットの一部にはCSV出力用のオプションが用意されています。
- DiffAssetRegistries
- ShaderPipelineCacheTools
https://docs.unrealengine.com/en-US/API/Runtime/Engine/Commandlets/UCommandlet/index.html
https://docs.unrealengine.com/en-US/API/Editor/UnrealEd/Commandlets/index.html

# おまけ：CSVToSVG
![CsvUnitFPSChart.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/7f23bbd4-301e-3eb2-dfb1-c628d88ad561.jpeg)
CSVの内容をより見やすくグラフ化するための機能が4.23で追加されました！
https://docs.unrealengine.com/ja/Engine/Performance/CSVToSVG/index.html

詳細に関してはまた後日！（Epic Games Japan Advent Calendar 2019のどこかでアップされるとかされないとか…

# おまけ：C++ / BPからCSVを出力する方法
EditorScripiting機能を使って各情報を収集・計測し結果をCSV出力したいケースがあるかと思います。その際は ```FFileHelper::SaveStringToFile``` 関数や```SaveStringArrayToFile```関数を活用しましょう！この関数にカンマ区切りの文字列を渡すことでCSVを出力する事が可能です。

実はこれまで紹介してきたCSV出力機能はこれらの関数を最終的に用いています。例えばDataTableのCSV出力を行っている FAssetTypeActions_DataTable::ExecuteExportAsCSV 関数では以下のように使われています。

```c++
const FText Title = FText::Format(LOCTEXT("DataTable_ExportCSVDialogTitle", "Export '{0}' as CSV..."), FText::FromString(*DataTable->GetName()));
const FString CurrentFilename = DataTable->AssetImportData->GetFirstFilename();
const FString FileTypes = TEXT("Data Table CSV (*.csv)|*.csv");

TArray<FString> OutFilenames;
DesktopPlatform->SaveFileDialog(
	ParentWindowWindowHandle,
	Title.ToString(),
	(CurrentFilename.IsEmpty()) ? TEXT("") : FPaths::GetPath(CurrentFilename),
	(CurrentFilename.IsEmpty()) ? TEXT("") : FPaths::GetBaseFilename(CurrentFilename) + TEXT(".csv"),
	FileTypes,
	EFileDialogFlags::None,
	OutFilenames
	);

if (OutFilenames.Num() > 0)
{
	FFileHelper::SaveStringToFile(DataTable->GetTableAsCSV(), *OutFilenames[0]);
}
```

残念ながらBPには公開されていないので…以下のように実装してBPノードを用意しましょう！

```c++
UFUNCTION(BlueprintCallable)
static bool ExportCSVFromCSVString(const FString& CSVString, FString Filename);
UFUNCTION(BlueprintCallable)
static bool ExportCSVFromDataTable(UDataTable* DataTable, FString Filename);

bool UMyBlueprintFunctionLibrary::ExportCSVFromCSVString(const FString& CSVString, FString Filename)
{
	return FFileHelper::SaveStringToFile(CSVString, *Filename);
}

bool UMyBlueprintFunctionLibrary::ExportCSVFromDataTable(UDataTable* DataTable, FString Filename)
{
	if (DataTable)
	{
		return FFileHelper::SaveStringToFile(DataTable->GetTableAsCSV(), *Filename);
	}
	return false;
}
```

おしまい