public static List <S13Column> PivotFrom(IList <AssignmentRowRaw> rows) { var columns = new List <S13Column>(); var territories = rows.GroupBy(r => r.Territory).ToList(); foreach (var territory in territories) { var column = new S13Column() { Territory = territory.Key }; foreach (var entry in territory.OrderBy(e => e.Entry)) { DateTime?checkedIn = null; if (DateTime.TryParse(entry.CheckedIn, out DateTime checkedInDate)) { checkedIn = checkedInDate; } DateTime?checkedOut = null; if (DateTime.TryParse(entry.CheckedOut, out DateTime checkedOutDate)) { checkedOut = checkedOutDate; } column.Entries.Add( new S13Entry { Publisher = entry.Publisher, CheckedIn = checkedIn, CheckedOut = checkedOut }); } columns.Add(column); } return(columns); }
static void PivotS13(List <string> args) { Console.WriteLine("Pivoting S-13 form..."); if (args.Count != 4) { throw new NormalException("Wrong number of arguments! Usage: alba pivot-s-13 <s-13-csv-input-file> <alba-assignments-csv-input-file> <s-13-csv-output-file>"); } string inputPath = args[1]; string albaTerritoryAssignmentsPath = args[2]; string outputPath = args[3]; Console.WriteLine($"Input File Path: {inputPath}"); Console.WriteLine($"Alba Assignment File Path: {albaTerritoryAssignmentsPath}"); Console.WriteLine($"Output File Path: {outputPath}"); Console.WriteLine("Loading..."); var rows = PivotAssignmentRowsToS13Columns.LoadFrom(inputPath); Console.WriteLine("Removing entries with Checked-In and Checked-Out both blank..."); var cleaned = rows .Where(r => !string.IsNullOrWhiteSpace(r.CheckedIn) || !string.IsNullOrWhiteSpace(r.CheckedOut)) .ToList(); Console.WriteLine("Pivoting..."); var columns = PivotAssignmentRowsToS13Columns.PivotFrom(cleaned); Console.WriteLine("Adding unworked territories..."); var assignments = DownloadTerritoryAssignments.LoadFromCsv(albaTerritoryAssignmentsPath); var errors = new List <string>(); foreach (var assignment in assignments) { try { int assignmentNumber = int.Parse(assignment.Number); if (!columns.Exists(c => string.Equals(c.Territory, assignmentNumber.ToString(), StringComparison.OrdinalIgnoreCase))) { var newCol = new S13Column { Territory = assignment.Number }; newCol.Entries.Add(new S13Entry { Publisher = "Never Worked" }); columns.Add(newCol); } } catch (Exception e) { errors.Add($"Number: {assignment.Number}: {e.Message}"); } } foreach (string error in errors) { Console.WriteLine(error); } var orderedColumns = columns.OrderBy(c => int.Parse(c.Territory)).ToList(); Console.WriteLine("Saving data to new file..."); PivotAssignmentRowsToS13Columns.SaveTo(orderedColumns, outputPath); }