public static void AssertEquals(SerializableEntityTable t1, SerializableEntityTable t2) { Assert.AreEqual(t1.Name, t2.Name); Assert.AreEqual(t1.IndexColumns.Count, t2.IndexColumns.Count); for (var i = 0; i < t1.IndexColumns.Count; ++i) { AssertEquals(t1.IndexColumns[i], t2.IndexColumns[i]); } Assert.AreEqual(t1.NumericColumns.Count, t2.NumericColumns.Count); for (var i = 0; i < t1.NumericColumns.Count; ++i) { AssertEquals(t1.NumericColumns[i], t2.NumericColumns[i]); } Assert.AreEqual(t1.StringColumns.Count, t2.StringColumns.Count); for (var i = 0; i < t1.StringColumns.Count; ++i) { AssertEquals(t1.StringColumns[i], t2.StringColumns[i]); } Assert.AreEqual(t1.Properties.Length, t2.Properties.Length); /* Can't expect the numerical values to be precise, because of non-determinism of parallelism when generating string table. * for (var i=0; i < t1.Properties.Length; ++i) * { * var p1 = t1.Properties[i]; * var p2 = t2.Properties[i]; * Assert.AreEqual(p1.EntityId, p2.EntityId); * Assert.AreEqual(p1.Name, p2.Name); * Assert.AreEqual(p1.Value, p2.Value); * } */ }
public static void ExportEntityTable(INamedBuffer buffer, string entityFolder, string[] strings) { var buffers = buffer.Unpack(); var baseName = Util.ToValidFileName(buffer.Name); var fileName = Path.Combine(entityFolder, baseName + ".csv"); var et = new SerializableEntityTable(); foreach (var b in buffers) { if (b.Name.StartsWith(VimConstants.IndexColumnNamePrefix)) { et.IndexColumns.Add(b.StripPrefix().ToTypedBuffer <int>()); } else if (b.Name.StartsWith(VimConstants.NumberColumnNamePrefix)) { et.NumericColumns.Add(b.StripPrefix().ToTypedBuffer <double>()); } else if (b.Name.StartsWith(VimConstants.StringColumnNamePrefix)) { et.StringColumns.Add(b.StripPrefix().ToTypedBuffer <int>()); } else if (b.Name == VimConstants.PropertiesBufferName) { et.Properties = b.AsSpan <SerializableProperty>().ToArray(); } else { throw new Exception($"{b.Name} is not a recognized entity table buffer"); } } var numRows = et.GetNumRows(); var rows = Enumerable .Range(0, numRows) .Select(row => et.GetEntityTableRowValues(row, strings)) .Prepend(et.GetColumnNames()); File.WriteAllLines(fileName, rows.Select(CsvUtil.ToCsvRow)); if (et.Properties.Length > 0) { var d = new Dictionary <int, Dictionary <string, string> >(); foreach (var p in et.Properties) { if (!d.ContainsKey(p.EntityIndex)) { d.Add(p.EntityIndex, new Dictionary <string, string>()); } var key = p.Name >= 0 ? strings[p.Name] : ""; var val = p.Value >= 0 ? strings[p.Value] : ""; d[p.EntityIndex].AddOrReplace(key, val); } JsonUtil.ToJsonFile(d, Path.Combine(entityFolder, baseName) + ".json"); } }
public static IEnumerable <string> GetColumnNames(this SerializableEntityTable et) { foreach (var col in et.NumericColumns) { yield return(col.Name); } foreach (var col in et.StringColumns) { yield return(col.Name); } foreach (var col in et.IndexColumns) { yield return(col.Name); } }
public static IEnumerable <string> GetEntityTableRowValues(this SerializableEntityTable et, int n, string[] strings) { foreach (var col in et.NumericColumns) { yield return(col.Data[n].ToString()); } foreach (var col in et.StringColumns) { yield return(col.Data[n] >= 0 ? strings[col.Data[n]] : ""); } foreach (var col in et.IndexColumns) { yield return(col.Data[n].ToString()); } }