Files
UnrealEngine/Engine/Source/Developer/TraceServices/Private/Common/Utils.cpp
2025-05-18 13:04:45 +08:00

89 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Utils.h"
#include "TraceServices/Utils.h"
#include "Common/FormatArgs.h"
#include "TraceServices/Containers/Tables.h"
#include "Templates/SharedPointer.h"
#include "HAL/FileManager.h"
DEFINE_LOG_CATEGORY(LogTraceServices);
namespace TraceServices
{
bool Table2Csv(const IUntypedTable& Table, const TCHAR* Filename)
{
TUniquePtr<FArchive> OutputFile(IFileManager::Get().CreateFileWriter(Filename));
if (!OutputFile.IsValid())
{
return false;
}
FString Header;
const ITableLayout& Layout = Table.GetLayout();
const uint64 ColumnCount = Layout.GetColumnCount();
for (uint64 ColumnIndex = 0; ColumnIndex < ColumnCount; ++ColumnIndex)
{
Header += Layout.GetColumnName(ColumnIndex);
if (ColumnIndex < ColumnCount - 1)
{
Header += TEXT(",");
}
else
{
Header += TEXT("\n");
}
}
auto AnsiHeader = StringCast<ANSICHAR>(*Header);
OutputFile->Serialize((void*)AnsiHeader.Get(), AnsiHeader.Length());
TUniquePtr<IUntypedTableReader> TableReader(Table.CreateReader());
for (; TableReader->IsValid(); TableReader->NextRow())
{
FString Line;
for (uint64 ColumnIndex = 0; ColumnIndex < ColumnCount; ++ColumnIndex)
{
switch (Layout.GetColumnType(ColumnIndex))
{
case TableColumnType_Bool:
Line += TableReader->GetValueBool(ColumnIndex) ? "true" : "false";
break;
case TableColumnType_Int:
Line += FString::Printf(TEXT("%lld"), TableReader->GetValueInt(ColumnIndex));
break;
case TableColumnType_Float:
Line += FString::Printf(TEXT("%f"), TableReader->GetValueFloat(ColumnIndex));
break;
case TableColumnType_Double:
Line += FString::Printf(TEXT("%f"), TableReader->GetValueDouble(ColumnIndex));
break;
case TableColumnType_CString:
FString ValueString = TableReader->GetValueCString(ColumnIndex);
ValueString.ReplaceInline(TEXT(","), TEXT(" "));
Line += ValueString;
break;
}
if (ColumnIndex < ColumnCount - 1)
{
Line += TEXT(",");
}
else
{
Line += TEXT("\n");
}
}
auto AnsiLine = StringCast<ANSICHAR>(*Line);
OutputFile->Serialize((void*)AnsiLine.Get(), AnsiLine.Length());
}
OutputFile->Close();
return true;
}
void StringFormat(TCHAR* Out, uint64 MaxOut, TCHAR* Temp, uint64 MaxTemp, const TCHAR* FormatString, const uint8* FormatArgs)
{
FFormatArgsHelper::Format(Out, MaxOut, Temp, MaxTemp, FormatString, FormatArgs);
}
} // namespace TraceServices