MikeStall / DataTable

Class library for working with tabular data, especially CSV files
Apache License 2.0
150 stars 63 forks source link

Programmatic way to add rows of data to a DataTable, modify data through indexers #31

Open yellis opened 10 years ago

yellis commented 10 years ago

DataTable.New contains different methods of creating a new MutableDataTable based on different source data. However, it appears that there is no way right now to add data one row at a time to a MutableDataTable, nor is there an easy way to modify specific "cells" of data in a table.

What I am looking for (adding a few different possible approaches):

var table = new MutableDataTable();
table.AddColumn("Id");
table.AddColumn("Name");
table.AddNewRow(new {Id = 1, Name="John"});
table.AddNewRow("1", "John"); // AddNewRow with param strings
var row = table.GetNewRow(); // appends new row to end of table and returns it
row[0] = 3; // use row indexer to access and modify values
row[1] = "Jane";
table.Rows[0][1] = "Jack"; // use rows indexer and then indexer on values in row to modify data
MikeStall commented 10 years ago

MutableDataTable is an array of column arrays. This makes it very easy to rearrange columns, but it means adding a new row is expensive since it means reallocating every column.

The approach I’ve used for row-based operations has been

Using a 2-d dictionary (this is also great for sparse tables):

    static void Main(string[] args)
    {
        var d = new Dictionary2d<int,string,string>(); 

        d[0,"Name"] = "jack";
        d[0, "score"] = "23";
        d[1,"Name"] = "jill";
        d[1, "score"] = "45";

        var table = DataTable.New.From2dDictionary(d);
        table.SaveToStream(Console.Out);
    } 

Using an IEnumerable: ''' class Row { public string Name { get; set; } public int score { get; set; } }

    static IEnumerable<Row> GetRows()
    {
        yield return new Row { Name = "Jack", score = 23 };
        yield return new Row { Name = "Jill", score = 45 };
    } 

    static void Main(string[] args)
    {
        var table = DataTable.New.FromEnumerable(GetRows());
        table.SaveToStream(Console.Out);
    } 

'''

Cells in a datatables can be changed like so:

''' // Mutate table.Columns[0].Values[1] = "Jen"; '''