-
Notifications
You must be signed in to change notification settings - Fork 3
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();