Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
param([Parameter(Position = 0)][string] $Path = 'C:\Users\grave\Downloads\ChessData-master\')
$code = @{
Name = 'ResultCounter'
Namespace = 'ChessData'
PassThru = $true
UsingNamespace = @(
'System.Collections.Concurrent',
'System.IO',
'System.Threading.Tasks'
)
MemberDefinition = @'
public static ConcurrentDictionary<string, int> ProcessChessFiles(string path)
{
ConcurrentDictionary<string, int> result = new ConcurrentDictionary<string, int>();
string tie = "1/2-1/2";
string black = "1-0";
string white = "0-1";
string lineResult = "[Result";
Parallel.ForEach<string>(Directory.EnumerateFiles(path, "*.pgn", SearchOption.AllDirectories), filename =>
{
using (StreamReader sr = new StreamReader(filename))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if ((line.Length - line.Replace(lineResult, String.Empty).Length) / lineResult.Length == 1)
{
if ((line.Length - line.Replace(black, String.Empty).Length) / black.Length == 1)
{
result.AddOrUpdate("Black", 1, (k, v) => v + 1);
}
else if ((line.Length - line.Replace(tie, String.Empty).Length) / tie.Length == 1)
{
result.AddOrUpdate("Tie", 1, (k, v) => v + 1);
}
else if ((line.Length - line.Replace(white, String.Empty).Length) / white.Length == 1)
{
result.AddOrUpdate("White", 1, (k, v) => v + 1);
}
}
}
}
});
return result;
}
'@
}
$CompilerParams = [System.CodeDom.Compiler.CompilerParameters]::new()
$CompilerParams.CompilerOptions = "/optimize+ /warn:0"
$class = Add-Type @code -CompilerParameters $CompilerParams |Select-Object -First 1
Measure-Command {
$res = $class::ProcessChessFiles($Path)
}
$res | Format-Table
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.