UE4 C++ 利用DataTable读取CSV文件(无需在蓝图中创建DataTable)

网上有许多用C++读取CSV文件的帖子,刚开始用了一个方法可以在打开csv文件的同时,也可以读取到文件里面的内容,但是这个方法在4.26会打包报错。该方法的大概流程为:

  1. 在C++里面写一个继承于FTableRowBase 的结构体
  2. 用这个结构体在编辑器里面创建一个DataTable表
  3. 利用函数UDataTableFunctionLibrary::FillDataTableFromCSVFile(DataTable, CSVPath);将CSV表中的数据写入创建的表中( 该函数在4.26打包中,会报错
    (7.12补充, 查阅该函数的属性宏标识:
    UFUNCTION(BlueprintCallable, Category = "Editor Scripting | DataTable", DisplayName = "Fill Data Table from CSV File"),编辑器脚本,所以不能打包)
  4. 得到表的每行的名字,根据名字在表中查找到这一行的数据,从而得到在C++中得到CSV文件中的数据


下面提供一种可以打包的版本(但是该版本在CSV文件打开的时候,会出现访问冲突而读取不到CSV文件)

  1. 在C++文件中添加头文件
#include "Engine/DataTable.h"

2. 创建一个结构体来储存CSV文件中的信息,该结构体得继承于 FTableRowBase

USTRUCT(BlueprintType)
struct  FStructInfo : public  FTableRowBase
	GENERATED_BODY()
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FString Name;
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		float Speed = 1.0f;
};

3. 创建函数读取CSV中的数据创建DataTable

UDataTable* ACSVManager::ReadCSVFile(FString csvPath)
	FString Data;
	if (FFileHelper::LoadFileToString(Data, *csvPath))//读取CSV文件
		UDataTable* Datatable = NewObject<UDataTable>();// 定义datatable
		Datatable->RowStruct = FStructInfo::StaticStruct();//定义datatable的结构体
		Datatable->CreateTableFromCSVString(Data);//将csv中的数据写入datatable