【UE4 C++】 Datatable 讀寫、導入導出 CSV/Json


Datatable 讀取行數據

1. 創建結構體

  • 繼承自 FTableRowBase

    USTRUCT(BlueprintType)
    struct  FSimpleStruct :public FTableRowBase
    {
    	GENERATED_USTRUCT_BODY()
    public:
    
    	UPROPERTY(EditAnywhere)
    		FString name;
    
    	UPROPERTY(EditAnywhere)
    		int32 health;
    
    	UPROPERTY(EditAnywhere)
    		UTexture2D* icon;
    };
    

2. 創建 Datatable

  • 選擇 FSimpleStruct 結構體

    image

3. 讀取行數據

  • FindRow

    UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
    if (UserInfoDataTable)
    {
    	for (FName RowName : UserInfoDataTable->GetRowNames())
    	{
    		FSimpleStruct* UserInfo = UserInfoDataTable->FindRow<FSimpleStruct>(RowName, TEXT("name"));
    		if (UserInfo)
    		{
    			UKismetSystemLibrary::PrintString(GetWorld(), UserInfo->name);
    		}
    	}
    }
    else
    {
    	UKismetSystemLibrary::PrintString(GetWorld(), TEXT(" Not Find DataTable!"));
    }
    
  • GetRowMap

    UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
    if (UserInfoDataTable)
    {
    	for (auto it : UserInfoDataTable->GetRowMap())
    	{
    		FString RowName = (it.Key).ToString();
    
    		FSimpleStruct* UserInfo = (FSimpleStruct*)it.Value;
    
    		UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("%s %s"), *RowName, *UserInfo->name));
    	}
    }
    

Datatable 寫入行數據

  • AddRow

    UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
    if (UserInfoDataTable)
    {
    	FSimpleStruct* UserInfo = new FSimpleStruct();
    	UserInfo->name = TEXT("Lily");
    	UserInfo->health = 80;
    	FName RowName = TEXT("Player3");
    	UserInfoDataTable->AddRow(RowName, *UserInfo);
    }
    

導入CSV

  • csv 文件

    ---,name,health,icon
    Player4,"馬克","200","Texture2D'/Game/FourEvilDragonsHP/Textures/DragonTheUsurper/BlueHPTex.BlueHPTex'"
    Player5,"冉冰","90","Texture2D'/Game/FourEvilDragonsHP/Textures/DragonTheSoulEater/BlueHPTex.BlueHPTex'"
    Player6,"墨城","150","None"
    
  • 填充現有的 DataTable

    UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
    if (UserInfoDataTable)
    {
    	FString CSVPath = FPaths::ProjectDir() + TEXT("DataDrive/UserInfo.csv");
    	CSVPath = FPaths::ConvertRelativePathToFull(CSVPath);
    	if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*CSVPath))
    	{
    		UDataTableFunctionLibrary::FillDataTableFromCSVFile(UserInfoDataTable, CSVPath);
    	}
    }
    
  • 生成 UDataTable

    UDataTable* ADataDriveActor::CreateDataTableFromCSV()
    {
    	FString CSVPath = FPaths::ProjectDir() + TEXT("DataDrive/UserInfo.csv");
    	CSVPath = FPaths::ConvertRelativePathToFull(CSVPath);
    	if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*CSVPath))
    	{
    		UKismetSystemLibrary::PrintString(GetWorld(), *CSVPath);
    		FString CSVData;
    		FFileHelper::LoadFileToString(CSVData, *CSVPath);
    		UDataTable* DT_UserInfo = NewObject<UDataTable>(GetTransientPackage(), FName(TEXT("DT_UserInfo2")));
    		DT_UserInfo->RowStruct = FSimpleStruct::StaticStruct();
    		DT_UserInfo->CreateTableFromCSVString(CSVData);
    
    		return DT_UserInfo;
    	}
    	return nullptr;
    }
    

導出 CSV

  • GetTableAsCSV

    UserInfoDataTable = LoadObject<UDataTable>(this, TEXT("DataTable'/Game/CPPFunction/DataDrive/DT_UserInfo.DT_UserInfo'"));
    if (UserInfoDataTable)
    {
    	FString CSVString = UserInfoDataTable->GetTableAsCSV();
    	FString CSVPath = FPaths::ProjectDir() + TEXT("DataDrive/UserInfo2.csv");
    	FFileHelper::SaveStringToFile(CSVString, *CSVPath, FFileHelper::EEncodingOptions::ForceUTF8);
    }
    
  • 原博客地址

導入導出Json

省略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM