Skip to content

Multiple result sets

jhgbrt edited this page Jul 24, 2023 · 2 revisions

NetCsv can read files that contain multiple result sets. For example, say we have a simplified order/orderdetails file, looking like this:

Id;FirstName;LastName;OrderDate;OrderTotal
1;John;Doe;2023-01-01;100
2;Jane;Doe;2023-01-02;110

OrderId;ItemName;Quantity;Price
1;Item 1;2;50
2;Item 1;1;50
2;Item 2;1;10
2;Item 2;1;50

The orders are listed first with the order items following in a second list. You can read this file as follows:

var reader = ReadCsv.FromString(input, emptyLineAction: EmptyLineAction.NextResult, hasHeaders: true);

Notice the emptyLineAction. Reading the contents of the file would then look like this:

var reader = ReadCsv.FromString(input, emptyLineAction: EmptyLineAction.NextResult, hasHeaders: true, delimiter: ';');
while (reader.Read())
{
    var orderId = reader.GetInt32(reader.GetOrdinal("Id"));
    var customerFirstName = reader.GetString(reader.GetOrdinal("FirstName"));
    var customerLastName = reader.GetString(reader.GetOrdinal("LastName"));
    var orderDate = reader.GetDateTime(reader.GetOrdinal("OrderDate"));
    var orderTotal = reader.GetDecimal(reader.GetOrdinal("OrderTotal"));
}

reader.NextResult();
while (reader.Read())
{
    var orderId = reader.GetInt32(reader.GetOrdinal("OrderId"));
    var itemName = reader.GetString(reader.GetOrdinal("ItemName"));
    var quantity = reader.GetInt32(reader.GetOrdinal("Quantity"));
    var price = reader.GetDecimal(reader.GetOrdinal("Price"));
}

If you prefer mapping directly to strongly typed objects, you can use something like this:

var schemas = Schema.From<Order, OrderItem>();

var reader = ReadCsv.FromString(input, emptyLineAction: EmptyLineAction.NextResult, hasHeaders: true, delimiter: ';', schema: schemas);

var orders = reader.AsEnumerable<Order>().ToList();
reader.NextResult();
var items = reader.AsEnumerable<OrderItem>().ToList();

Clone this wiki locally