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"); } }