From e92f2007b32a14439c1f4affb47f7d327c78a641 Mon Sep 17 00:00:00 2001
From: "jonathan.ehret" <ehret@vr.rwth-aachen.de>
Date: Mon, 27 Feb 2023 15:40:28 +0100
Subject: [PATCH] sanitize logged data to not make problems in csv files

---
 .../Private/SFCondition.cpp                   | 25 ++++++++++++++++---
 .../StudyFrameworkPlugin/Public/SFCondition.h |  2 ++
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/Source/StudyFrameworkPlugin/Private/SFCondition.cpp b/Source/StudyFrameworkPlugin/Private/SFCondition.cpp
index aa24a20..b4ddcbc 100644
--- a/Source/StudyFrameworkPlugin/Private/SFCondition.cpp
+++ b/Source/StudyFrameworkPlugin/Private/SFCondition.cpp
@@ -112,8 +112,9 @@ bool USFCondition::StoreDependentVariableData(const FString& VarName, const FStr
 	{
 		return false;
 	}
-
-	DependentVariable->Value = Value;
+	FString SanitizedValue = Value;
+	SanitizeValueForCSV(SanitizedValue);
+	DependentVariable->Value = SanitizedValue;
 	return true;
 }
 
@@ -149,10 +150,15 @@ bool USFCondition::StoreMultipleTrialDependentVariableData(const FString& VarNam
 		return false;
 	}
 
-	USFGameInstance::Get()->GetParticipant()->StoreTrialInPhaseLongTable(TrialDependentVar, Values);
+	TArray<FString> SanitizedValues = Values;
+	for(FString& Value : SanitizedValues)
+	{
+		SanitizeValueForCSV(Value);
+	}
+	USFGameInstance::Get()->GetParticipant()->StoreTrialInPhaseLongTable(TrialDependentVar, SanitizedValues);
 
 	std::vector<FString> ValuesVector;
-	for(const FString& Value : Values)
+	for(const FString& Value : SanitizedValues)
 	{
 		ValuesVector.push_back(Value);
 	}
@@ -193,6 +199,17 @@ USFDependentVariable* USFCondition::GetDependentVarForDataStoring(const FString&
 	return nullptr;
 }
 
+bool USFCondition::SanitizeValueForCSV(FString& Value)
+{
+	if(Value.Contains(","))
+	{
+		FSFLoggingUtils::Log("Cannot log data containing a ',' into a csv file, replacing ',' with [Komma]", true);
+		Value.ReplaceInline(TEXT(","), TEXT("[Komma]"));
+		return false;
+	}
+	return true;
+}
+
 float USFCondition::GetTimeTaken() const
 {
 	return TimeTaken;
diff --git a/Source/StudyFrameworkPlugin/Public/SFCondition.h b/Source/StudyFrameworkPlugin/Public/SFCondition.h
index ca4ce64..21522f7 100644
--- a/Source/StudyFrameworkPlugin/Public/SFCondition.h
+++ b/Source/StudyFrameworkPlugin/Public/SFCondition.h
@@ -78,6 +78,8 @@ protected:
 
 	USFDependentVariable* GetDependentVarForDataStoring(const FString& VarName, const FString& Data);
 
+	bool SanitizeValueForCSV(FString& Value);
+
 private:
 
 	bool bStarted=false;
-- 
GitLab