Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2020
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.75 KB | None | 0 0
  1. using CsvHelper;
  2. using CsvHelper.Configuration;
  3. using CsvHelper.Configuration.Attributes;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Globalization;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. using System.Threading.Tasks;
  12.  
  13. namespace ConsoleApp1
  14. {
  15.     public class Program
  16.     {
  17.         private readonly string[] SOURCE_FILES = new string[]
  18.         {
  19.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\deces-2018.csv"),
  20.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\deces-2019.csv"),
  21.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\deces-2020-m01.csv"),
  22.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M02.csv"),
  23.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M03.csv"),
  24.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M04.csv"),
  25.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M05.csv"),
  26.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M06.csv"),
  27.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M07.csv"),
  28.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M08.csv"),
  29.             Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\Deces_2020_M09.csv"),
  30.         };
  31.         private readonly string DESTINATION_FILE = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads\deaths\output.csv");
  32.  
  33.         public static async Task Main(string[] args)
  34.         {
  35.             Console.WriteLine("Starting");
  36.             try
  37.             {
  38.                 var program = new Program();
  39.                 await program.Run();
  40.             }
  41.             catch (Exception ex)
  42.             {
  43.                 Console.WriteLine("ERROR");
  44.                 Console.WriteLine(ex.ToString());
  45.             }
  46.             Console.WriteLine("Stopping");
  47.         }
  48.  
  49.         public Task Run()
  50.         {
  51.             var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
  52.             {
  53.                 Delimiter = ";",
  54.                 HasHeaderRecord = true
  55.             };
  56.  
  57.             // Read input data
  58.             var records = new List<InputEntry>();
  59.             foreach (string sourceFile in SOURCE_FILES)
  60.             {
  61.                 using var reader = new StreamReader(sourceFile);
  62.                 using var csvReader = new CsvReader(reader, csvConfig);
  63.                 IEnumerable<InputEntry> entries = csvReader.GetRecords<InputEntry>();
  64.                 records.AddRange(entries);
  65.             }
  66.  
  67.             // Compute stats
  68.             var stats = new Dictionary<string, Dictionary<int, int>>();
  69.             foreach (InputEntry record in records)
  70.             {
  71.                 Match match = Regex.Match(record.DeathDate, @"(20\d\d)(\d\d)(\d\d)");
  72.                 if (match.Success)
  73.                 {
  74.                     int year = int.Parse(match.Groups[1].Value);
  75.                     int month = int.Parse(match.Groups[2].Value);
  76.                     int day = int.Parse(match.Groups[3].Value);
  77.                     string date = $"{month:00}-{day:00}";
  78.  
  79.                     if (!stats.ContainsKey(date))
  80.                     {
  81.                         stats[date] = new Dictionary<int, int>();
  82.                     }
  83.                     Dictionary<int, int> stat = stats[date];
  84.                     if (!stat.ContainsKey(year))
  85.                     {
  86.                         stat[year] = 1;
  87.                     }
  88.                     else
  89.                     {
  90.                         stat[year]++;
  91.                     }
  92.                 }
  93.             }
  94.  
  95.             // Write output data
  96.             var outEntries = new List<OutputEntry>();
  97.             foreach (KeyValuePair<string, Dictionary<int, int>> stat in stats.OrderBy(x => x.Key))
  98.             {
  99.                 var outEntry = new OutputEntry()
  100.                 {
  101.                     Day = stat.Key,
  102.                     Year2018 = stat.Value.GetValueOrDefault(2018, 0),
  103.                     Year2019 = stat.Value.GetValueOrDefault(2019, 0),
  104.                     Year2020 = stat.Value.GetValueOrDefault(2020, 0)
  105.                 };
  106.                 outEntries.Add(outEntry);
  107.             }
  108.             using var writer = new StreamWriter(DESTINATION_FILE, append: false, encoding: Encoding.UTF8);
  109.             using var csvWriter = new CsvWriter(writer, csvConfig);
  110.             csvWriter.WriteRecords(outEntries);
  111.  
  112.             return Task.CompletedTask;
  113.         }
  114.     }
  115.  
  116.     public class InputEntry
  117.     {
  118.         [Name("nomprenom")]
  119.         public string Name { get; set; }
  120.         [Name("sexe")]
  121.         public string Gender { get; set; }
  122.         [Name("datenaiss")]
  123.         public string BirthDate { get; set; }
  124.         [Name("lieunaiss")]
  125.         public string BirthPlace { get; set; }
  126.         [Name("commnaiss")]
  127.         public string BirthCity { get; set; }
  128.         [Name("paysnaiss")]
  129.         public string BirthCountry { get; set; }
  130.         [Name("datedeces")]
  131.         public string DeathDate { get; set; }
  132.         [Name("lieudeces")]
  133.         public string DeathPlace { get; set; }
  134.         [Name("actedeces")]
  135.         public string DeathCertificate { get; set; }
  136.     }
  137.  
  138.     public class OutputEntry
  139.     {
  140.         [Name("day")]
  141.         public string Day { get; set; }
  142.         [Name("2018")]
  143.         public int Year2018 { get; set; }
  144.         [Name("2019")]
  145.         public int Year2019 { get; set; }
  146.         [Name("2020")]
  147.         public int Year2020 { get; set; }
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement