On Wed, 19 Jul 2017 07:41:31 GMT, orfeo wrote:

How do you serialize your data?

On Tue, 18 Jul 2017 15:07:09 GMT, Alexey Kulentsov wrote:

I have CSV source with numbers like 40.94, but after reading it and serializing to JSON I have something like 40.93999862670898 because of float representation, so my JSON file is very big. Is this possible to round it back when serializing?

struct CsvLogParser
{
	// ...

	struct Result
	{
		string[] names;
		Json[][] data;
	}
	
	static Result parseFile(string filename)
	{
		import std.algorithm: joiner;
		return parseRange(File(filename, "r").byLine.joiner("\n"), "s");
	}

	static Result parseRange(T)(T range, string prefix)
	{
		// ...
		Result result;
		enum floatMask = ctRegex!`^(\d*\.\d+)|(\d+\.\d*)$`;
		
		foreach(record; range.csvReader!(string))
		{
			string[] a = record.array;
			a[0] = convertDate(a[0]);
			result.data ~= a.map!((item){
			   if(!item.matchFirst(floatMask).empty)
				   return Json(item.to!float);
			   else
				   return Json(item);
			}).array;
		}
		
		// ...
			
		return result;
	}
}


class LogFilesDataPage : JsonPage!ForOnlyLogged
{
	// ...
	override Json getJson()
	{
		// ...
		foreach(filename; filenames)
		{
			// ...
			result[filename] = CsvLogParser.parseFile(client.logFilesDir~"/"~filename);
		}
		
		return serializeToJson(result);
	}
}

unittest
{
	// ...
	auto range = [ 
"01/03/2017 00:00:46,37.68,42.86,40.17,36.52,35.44,36.97,34.44,34.45",
"01/03/2017 01:00:32,37.41,42.28,39.56,35.77,33.73,35.68,33.8,34.29",
"01/03/2017 02:00:28,37.8,41.77,39.2,34.69,32.68,35.26,33.58,34.2",
"01/03/2017 03:00:24,37.9,41.46,38.43,33.28,32.13,35.14,33.52,34.17",
"01/03/2017 04:00:20,37.48,41.37,38.3,32.1,31.78,35.4,33.43,34.14",
"01/03/2017 05:00:16,42.65,43.85,38.8,31.21,31.56,34.96,33.44,34.11"
];
	// ...
}