using System.Globalization;
using System.Collections.Generic;
using BinaryFog.NameParser;
public static void Main()
var namesUrl = "https://gist.githubusercontent.com/chrisxh/0e2762ee5a303864da6219a682b40328/raw/cf8272d373343e6610243337371a960bd87151c2/mn_licensee_names.csv";
Console.WriteLine($"Reading list of licensee names from {namesUrl}");
var licNames = GetLicenseeNamesFromRemoteUrl(namesUrl);
Console.WriteLine($"Retrieved {licNames.Count} licensee names");
TestNameParser(licNames);
TestBFFullNameParser(licNames);
public static Dictionary<string, string> TestNameParser(List<LicenseeName> licNames){
var parsed = new Dictionary<string, string>();
int crudeGuessMatchCount = 0;
int crudeGuessMismatchCount = 0;
foreach(var lic in licNames){
var parsedName = new HumanName(lic.FullName);
if(parsedName.IsUnparsable){
Console.WriteLine($"Could not parse [{lic.FullName}] for {lic.FileFolderNumber}");
parsed.Add($"{lic.FullName}:{lic.FileFolderNumber}", parsedName.Last);
if(parsedName.Last.Equals(lic.CrudeGuess1)){
crudeGuessMismatchCount++;
Console.WriteLine($"CrudeGuess [{lic.CrudeGuess1}]\t\tParsed [{parsedName.Last}] \t\t\t Orig: [{lic.FullName}]");
if(parsedName.Last != parsedName.LastBase){
Console.WriteLine($"LastBase [{parsedName.LastBase}]\t\tLast [{parsedName.Last}]");
Console.WriteLine("Completed scan with NameParserSharp:");
Console.WriteLine($"Total names tested: {licNames.Count}");
Console.WriteLine($"Parsable names: {parsableCount}");
Console.WriteLine($"unParsable names: {unparsableCount}");
var guessMatchPct = ((double)( crudeGuessMatchCount * 1.0 / parsableCount )).ToString("P4", System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine($"Match rate against CrudeGuess: {crudeGuessMatchCount} / {(crudeGuessMatchCount + crudeGuessMismatchCount)} ({guessMatchPct})");
public static Dictionary<string, string> TestBFFullNameParser(List<LicenseeName> licNames){
var parsed = new Dictionary<string, string>();
int crudeGuessMatchCount = 0;
int crudeGuessMismatchCount = 0;
foreach(var lic in licNames){
var parsedName = new FullNameParser(lic.FullName);
if(null == parsedName || (!string.IsNullOrWhiteSpace(lic.FullName) && string.IsNullOrWhiteSpace(parsedName.DisplayName))){
Console.WriteLine($"Could not parse [{lic.FullName}] for {lic.FileFolderNumber}");
parsed.Add($"{lic.FullName}:{lic.FileFolderNumber}", parsedName.LastName);
if(parsedName.LastName.Equals(lic.CrudeGuess1)){
crudeGuessMismatchCount++;
Console.WriteLine($"CrudeGuess [{lic.CrudeGuess1}]\t\tParsed [{parsedName.LastName}] \t\t\t Orig: [{lic.FullName}]");
Console.WriteLine("Completed scan with BinaryFog.NameParser:");
Console.WriteLine($"Total names tested: {licNames.Count}");
Console.WriteLine($"Parsable names: {parsableCount}");
Console.WriteLine($"unParsable names: {unparsableCount}");
var guessMatchPct = ((double)( crudeGuessMatchCount * 1.0 / parsableCount )).ToString("P4", System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine($"Match rate against CrudeGuess: {crudeGuessMatchCount} / {(crudeGuessMatchCount + crudeGuessMismatchCount)} ({guessMatchPct}%)");
public static List<LicenseeName> GetLicenseeNamesFromRemoteUrl(string url)
var licNames = new List<LicenseeName>();
var engine = new FileHelperAsyncEngine<LicenseeName>();
using(var wc = new System.Net.WebClient())
using(var ms = new System.IO.MemoryStream(wc.DownloadData(new Uri(url))))
using(var tr = new System.IO.StreamReader(ms)){
engine.BeginReadStream(tr);
foreach(LicenseeName lic in engine)
public class LicenseeName
public int FileFolderNumber;
public string CrudeGuess1;