Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   General Forum (http://www.chiefdelphi.com/forums/forumdisplay.php?f=16)
-   -   Jaci's Annual FRC Datadump 2016 (http://www.chiefdelphi.com/forums/showthread.php?t=148257)

Jaci 06-05-2016 04:34

Jaci's Annual FRC Datadump 2016
 
Welcome to the inaugural release of my FRC datadumps :D

You can download the sql database here. It contains data about every match, stat, event, team, rank, district, award... everything. The database itself is about 13MB but it's been zipped together with some instructions and examples to bring the filesize down to about 5MB.

So let's see what we can do with it....

How about seeing all the matches your team has had over 100 points?

Code:

SELECT matches.key, events.short_name, match_scores.total_points, match_scores.alliance_color FROM matches
INNER JOIN events ON events.id == matches.event                # Join the Event so we can see the Event Name
INNER JOIN match_scores ON matches.id == match_scores.match    # Join the Scores so we can filter based on score
INNER JOIN match_teams ON matches.id == match_teams.match      # Join the Teams so we can filter based on team
WHERE match_teams.alliance_color == match_scores.alliance_color # Make sure the scores we're checking are the same as our team's alliance
AND match_scores.total_points > 100                            # Make sure the score is over 100 points
AND match_teams.team == 5333                                    # Make sure we're checking matches with our team
ORDER BY match_scores.total_points DESC                        # Order by the match score, descending

Or every match in 2016 over 250 points?

Code:

SELECT matches.key, match_scores.total_points, match_scores.alliance_color FROM matches
INNER JOIN match_scores ON matches.id == match_scores.match  # Join the scores table, so we can see the scores
WHERE match_scores.total_points > 250                        # Filter by scores 250+
ORDER BY match_scores.total_points DESC                      # Order the scored descending

Or every match where there have been more High Goals scored in Auto than Teleop?

Code:

SELECT events.short_name, matches.key, match_scores.alliance_color, match_scores.auto_boulders_high, match_scores.teleop_boulders_high FROM match_scores
INNER JOIN matches ON matches.id == match_scores.match                  # Join the matches so we can get the match key
INNER JOIN events ON matches.event == events.id                        # Join the events so we can get the event name
WHERE match_scores.auto_boulders_high > match_scores.teleop_boulders_high  # Check the auto boulders high is larger than the teleop equivilent
ORDER BY match_scores.auto_boulders_high DESC                          # Order by auto boulders high, descending

Or something a little more advanced... every Alliance Selection where the Captain's OPR is less than the 1st Pick's OPR...

Code:

SELECT events.short_name, alliances.num, teams.id FROM alliances
INNER JOIN alliance_picks ON alliances.id == alliance_picks.alliance        # Join the alliance picks for this alliance
INNER JOIN events ON events.id == alliances.event                          # Join the event for this alliance
INNER JOIN teams ON alliance_picks.team == teams.id                        # Join the teams for the picks
INNER JOIN stats ON stats.team == teams.id                                  # Join the statistics (opr) for the teams
WHERE alliance_picks.pick == 0                                              # Select the Captain team
AND stats.event == events.id                                                # Make sure the event we're checking OPRs is the same event we're checking alliances on
AND
(SELECT stats.opr FROM alliance_picks                                      # Select the OPR stat
INNER JOIN stats ON stats.team == alliance_picks.team                      # Join the stats to the alliance picks
WHERE alliance_picks.alliance == alliances.id                              # Make sure the alliance we're checking is the same alliance the captain is from
AND alliance_picks.pick == 1)                                              # Make sure we're checking the 1st Pick. At this point, the OPR stat is selected
> stats.opr                                                                # Check the 1st picks OPR from the previous select against the captains

All these can be seen in the examples of the ZIP file.

Foster 06-05-2016 06:10

Re: Jaci's Annual FRC Datadump 2016
 
Thanks for pulling all this together. I use R as a tool to look at data, so it will be nice to have all this available locally to mess around with.

Ether 06-05-2016 09:42

Re: Jaci's Annual FRC Datadump 2016
 

Very impressive! Nice work.


markmcgary 06-05-2016 16:47

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Jaci (Post 1584384)
Welcome to the inaugural release of my FRC datadumps :D

Or something a little more advanced... every Alliance Selection where the Captain's OPR is less than the 1st Pick's OPR...

Code:

SELECT events.short_name, alliances.num, teams.id FROM alliances
INNER JOIN alliance_picks ON alliances.id == alliance_picks.alliance        # Join the alliance picks for this alliance
INNER JOIN events ON events.id == alliances.event                          # Join the event for this alliance
INNER JOIN teams ON alliance_picks.team == teams.id                        # Join the teams for the picks
INNER JOIN stats ON stats.team == teams.id                                  # Join the statistics (opr) for the teams
WHERE alliance_picks.pick == 0                                              # Select the Captain team
AND stats.event == events.id                                                # Make sure the event we're checking OPRs is the same event we're checking alliances on
AND
(SELECT stats.opr FROM alliance_picks                                      # Select the OPR stat
INNER JOIN stats ON stats.team == alliance_picks.team                      # Join the stats to the alliance picks
WHERE alliance_picks.alliance == alliances.id                              # Make sure the alliance we're checking is the same alliance the captain is from
AND alliance_picks.pick == 1)                                              # Make sure we're checking the 1st Pick. At this point, the OPR stat is selected
> stats.opr                                                                # Check the 1st picks OPR from the previous select against the captains

All these can be seen in the examples of the ZIP file.

Thank you for this. Really great work. Your 'more advanced' example intrigued me because I know our team was a 1st pick for alliance 5 at the OCR (CAPL) and we had a higher OPR. When I ran your query, we did not appear in the results. I did a little testing and found an improvement to the SQL.

Code:

SELECT events.short_name, alliances.num, teams.id, stats.opr FROM alliances
INNER JOIN alliance_picks ON alliances.id == alliance_picks.alliance
INNER JOIN events ON events.id == alliances.event
INNER JOIN teams ON alliance_picks.team == teams.id
INNER JOIN stats ON stats.team == teams.id
WHERE alliance_picks.pick == 0
AND alliances.event == stats.event
AND
(SELECT stats.opr FROM alliance_picks
INNER JOIN stats ON stats.team == alliance_picks.team
WHERE alliance_picks.alliance == alliances.id
AND stats.event = alliances.event
AND alliance_picks.pick == 1)
> stats.opr
ORDER BY events.short_name, alliances.num

Now, we appear in the results as expected!

Thanks again for putting this together.

Jaci 06-05-2016 17:55

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by markmcgary (Post 1584609)
Thank you for this. Really great work. Your 'more advanced' example intrigued me because I know our team was a 1st pick for alliance 5 at the OCR (CAPL) and we had a higher OPR. When I ran your query, we did not appear in the results. I did a little testing and found an improvement to the SQL.

Code:

SELECT events.short_name, alliances.num, teams.id, stats.opr FROM alliances
INNER JOIN alliance_picks ON alliances.id == alliance_picks.alliance
INNER JOIN events ON events.id == alliances.event
INNER JOIN teams ON alliance_picks.team == teams.id
INNER JOIN stats ON stats.team == teams.id
WHERE alliance_picks.pick == 0
AND alliances.event == stats.event
AND
(SELECT stats.opr FROM alliance_picks
INNER JOIN stats ON stats.team == alliance_picks.team
WHERE alliance_picks.alliance == alliances.id
AND stats.event = alliances.event
AND alliance_picks.pick == 1)
> stats.opr
ORDER BY events.short_name, alliances.num

Now, we appear in the results as expected!

Thanks again for putting this together.

Ahh, keen eye, good job! I can't wait to see what queries ya'll can come up with using this Data Dump

Ether 06-05-2016 22:00

Re: Jaci's Annual FRC Datadump 2016
 

Jaci, how is your name pronounced? Does it rhyme with "classy" or "lacy"?


Jaci 06-05-2016 22:17

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Ether (Post 1584698)

Jaci, how is your name pronounced? Does it rhyme with "classy" or "lacy"?


It rhymes with classy :)

antman 07-05-2016 00:43

Re: Jaci's Annual FRC Datadump 2016
 
Thanks for making all this data easily accessible. So here's something my team was casually tracking throughout the season: the 100% breach club. Here's the the sql for one way to get the answer:

Code:

select substr(teams.key, 4) as team, match_counts.match_count
from teams
inner join
(select match_teams.team, count(match_teams.id) as match_count
from match_teams
group by match_teams.team) as match_counts
on substr(teams.key, 4) = match_counts.team
inner join
(select match_teams.team, sum(match_scores.defenses_breached) as breach_count
from match_teams inner join match_scores on match_teams.match = match_scores.match and match_teams.alliance_color = match_scores.alliance_color
group by match_teams.team) as breach_counts
on substr(teams.key, 4) = breach_counts.team
where match_counts.match_count = breach_counts.breach_count
order by cast(substr(teams.key, 4) as int)

and here's the result:

Team Match Count
101 10
159 11
525 45
558 68
1014 30
1569 17
1750 11
1986 51
2062 28
2354 11
2767 63
2855 11
2882 10
3225 16
3238 65
3310 46
3488 10
3546 65
3683 50
3695 10
4476 12
4931 28
5254 45
5271 10
5618 27
5805 21
5905 11
5951 14

Jaci 07-05-2016 01:21

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by antman (Post 1584729)
Thanks for making all this data easily accessible. So here's something my team was casually tracking throughout the season: the 100% breach club. Here's the the sql for one way to get the answer:

Code:

select substr(teams.key, 4) as team, match_counts.match_count
from teams
inner join
(select match_teams.team, count(match_teams.id) as match_count
from match_teams
group by match_teams.team) as match_counts
on substr(teams.key, 4) = match_counts.team
inner join
(select match_teams.team, sum(match_scores.defenses_breached) as breach_count
from match_teams inner join match_scores on match_teams.match = match_scores.match and match_teams.alliance_color = match_scores.alliance_color
group by match_teams.team) as breach_counts
on substr(teams.key, 4) = breach_counts.team
where match_counts.match_count = breach_counts.breach_count
order by cast(substr(teams.key, 4) as int)


Just for reference: instead of doing a substr on teams.key, teams.id is the team number itself. We use the Team Number as the Primary Key since they're unique per team.

Whatever 13-05-2016 11:29

Re: Jaci's Annual FRC Datadump 2016
 
I am not an SQL expert so I was hoping someone could help me out.

Some trivia questions I was curious in:
1. Alliance with the greatest sum of team numbers;
2. Alliance with the lowest sum of team numbers;
3. Alliance with the narrowest range of team numbers;
4. Alliance with the widest range of team numbers;
5. Any Palindrome alliances during the year? (either full team numbers like 2052,525,2502 or spread across team numbers like 610,3130,16)

jvriezen 13-05-2016 13:00

Re: Jaci's Annual FRC Datadump 2016
 
Hmm... Franks blog post claims there were 13,303 matches played, but the matches table has only 13,302 rows.

Clearly there is something going on here and someone is hiding the data for a match that they don't want made public :D

Ether 13-05-2016 13:15

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Whatever (Post 1586411)
1. Alliance with the greatest sum of team numbers;
2. Alliance with the lowest sum of team numbers;

For all 3-alliance teams that actually played a match:

6138+6137+6208 = 18483 (blue)

11+56+41 = 108 (red)



markmcgary 13-05-2016 13:39

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Ether (Post 1586430)
For all 3-alliance teams that actually played a match:

6138+6137+6208 = 18483 (blue)

11+56+41 = 108 (red)

Can you show your work, please? :)

Ether 13-05-2016 14:20

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by markmcgary (Post 1586432)
Can you show your work, please? :)

I haven't done SQL in decades. I just cobbled up an AWK script to read the match_teams table.

Code:

(ac=="red") && ($3=="red"){red+=$4; next}

(ac=="blue") && ($3=="blue"){blue+=$4; next}

(ac=="red") && ($3!="red"){
        if(red>max){max=red; idmax=$1}
        if(red<min){min=red; idmin=$1}
        ac="blue"; blue=$4; next}

(ac=="blue") && ($3!="blue"){
        if(blue>max){max=blue; idmax=$1}
        if(blue<min){min=blue; idmin=$1}
        ac="red"; red=$4; next}



jvriezen 13-05-2016 14:27

Re: Jaci's Annual FRC Datadump 2016
 
I just did:

select count(*) from matches;

which returned one less than Franks numbers.

I've been doing SQL forever....

Ether 13-05-2016 14:35

Re: Jaci's Annual FRC Datadump 2016
 

If you export the database tables, the "sqlite_sequence" table lists the number of records in each table:
Code:

event_types                        7
match_levels                        5
defenses                        9
districts                        8
events                                139
alliances                        1088
alliance_picks                        3336
matches                                13302
match_defenses                        133020
match_teams                        79812
match_scores                        26604
awards                                3251
stats                                6194
rankings                        6194
district_teams                        1180
district_rankings                1179
district_event_points                2789


jvriezen 13-05-2016 14:41

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Ether (Post 1586430)
For all 3-alliance teams that actually played a match:

6138+6137+6208 = 18483 (blue)

11+56+41 = 108 (red)



Here is the SQL that gives the same answer:

sqlite> select a.team, b.team, c.team, max(a.team+b.team+c.team) from match_teams a join match_teams b on a.match=b.match join match_teams c on b.match = c.match where a.team <> b.team and a.team <> c.team and b.team <> c.team and a.alliance_color = b.alliance_color and b.alliance_color = c.alliance_color ;

6138|6137|6208|18483

sqlite> select a.team, b.team, c.team, min(a.team+b.team+c.team) from match_teams a join match_teams b on a.match=b.match join match_teams c on b.match = c.match where a.team <> b.team and a.team <> c.team and b.team <> c.team and a.alliance_color = b.alliance_color and b.alliance_color = c.alliance_color ;

41|11|56|108

jvriezen 13-05-2016 14:59

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Whatever (Post 1586411)
I am not an SQL expert so I was hoping someone could help me out.

Some trivia questions I was curious in:
3. Alliance with the narrowest range of team numbers;
4. Alliance with the widest range of team numbers;

Widest range:

sqlite> select a.team, b.team, c.team, max(a.team - c.team) from match_teams a join match_teams b on a.match=b.match and a.team > b.team join match_teams c on b.match = c.match and b.team > c.team where a.alliance_color = b.alliance_color and b.alliance_color = c.alliance_color ;
6231|5536|11|6220

Narrowest:

sqlite> select a.team, b.team, c.team, min(a.team - c.team) from match_teams a join match_teams b on a.match=b.match and a.team > b.team join match_teams c on b.match = c.match and b.team > c.team where a.alliance_color = b.alliance_color and b.alliance_color = c.alliance_color ;

177|176|175|2

Whatever 13-05-2016 15:04

Re: Jaci's Annual FRC Datadump 2016
 
Thank you

Foster 13-05-2016 15:05

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Ether (Post 1586446)
I haven't done SQL in decades. I just cobbled up an AWK script to read the match_teams table.

Yay AWK, and once again showing there is more than one way to parse the data. I'm going to guess that Ether's was a little faster, since the data only will get a single read, the other method using SQL has quite a few joins.

Ether 13-05-2016 15:08

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Foster (Post 1586466)
I'm going to guess that Ether's was a little faster

440 milliseconds on my 10-year-old Pentium D desktop running 32 bit XP.



antman 13-05-2016 15:23

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by jvriezen (Post 1586453)
select a.team, b.team, c.team, max(a.team+b.team+c.team) from match_teams a join match_teams b on a.match=b.match join match_teams c on b.match = c.match where a.team <> b.team and a.team <> c.team and b.team <> c.team and a.alliance_color = b.alliance_color and b.alliance_color = c.alliance_color ;

41|11|56|108

I think this "max" was supposed to be a "min".

jvriezen 13-05-2016 15:27

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by antman (Post 1586473)
I think this "max" was supposed to be a "min".

Fixed.

markmcgary 13-05-2016 15:28

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Ether (Post 1586446)
I haven't done SQL in decades. I just cobbled up an AWK script to read the match_teams table.

Code:

(ac=="red") && ($3=="red"){red+=$4; next}

(ac=="blue") && ($3=="blue"){blue+=$4; next}

(ac=="red") && ($3!="red"){
        if(red>max){max=red; idmax=$1}
        if(red<min){min=red; idmin=$1}
        ac="blue"; blue=$4; next}

(ac=="blue") && ($3!="blue"){
        if(blue>max){max=blue; idmax=$1}
        if(blue<min){min=blue; idmin=$1}
        ac="red"; red=$4; next}


I had to do a little AWK research. If I read this correctly, your idmax and idmin will point to the record in match_teams that immediately follows the max/min alliances?

It's amazing how many tools there are to accomplish a given task. Always something new to learn.

Ether 13-05-2016 15:39

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by markmcgary (Post 1586477)
I had to do a little AWK research. If I read this correctly, your idmax and idmin will point to the record in match_teams that immediately follows the max/min alliances?

Yes. I could have subtracted 1, but this is not production code :)

Quote:

It's amazing how many tools there are to accomplish a given task. Always something new to learn.
I started using AWK a lot back in '96 when my main workstation was a DEC VAX/VMS and I had to wrangle large text datasets in various wacky formats. It was a lifesaver.



antman 13-05-2016 15:48

Re: Jaci's Annual FRC Datadump 2016
 
I think there is a problem with jvriezen's SQL to get the max sum of team numbers on an alliance. I can't find a match where the 3 teams 6204|6191|6212 are on the same alliance. Here is my approach to answering this question:

select m.match, m.alliance_color, sum(m.team) as team_number_total from match_teams m group by m.match, m.alliance_color order by sum(m.team) desc

It gives a descending order list with the winner being match 5986, blue alliance, team total 18483 (which agrees with Ether's answer).

Ether 13-05-2016 15:55

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by antman (Post 1586484)
I think there is a problem with both jvriezen's SQL to get the max sum of team numbers on an alliance and I guess Ether's awk method too (can't speak to that, haven't used awk), since they are giving the same answer...

team total 18483...the 3 teams on the blue side were 6137, 6138, and 6208.

Go look again at my post. That's the answer I gave.



antman 13-05-2016 15:57

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Ether (Post 1586486)
Go look again at my post. That's the answer I gave.



Sorry, you're right, I was going by what jvriezen had said but his/her answer wasn't the same as yours. I'll edit my earlier post.

Ether 13-05-2016 16:05

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by antman (Post 1586489)
Sorry, you're right, I was going by what jvriezen had said but his/her answer wasn't the same as yours. I'll edit my earlier post.

His original SQL code had an error; he was pulling the top 3 team numbers from match 445 without regard to alliance:
Code:

2662,444,blue,6083
2663,444,blue,4739
2664,444,blue,5331
2665,445,red,5876
2666,445,red,4729
2667,445,red,6191
2668,445,blue,6212

2669,445,blue,3132
2670,445,blue,6204
2671,446,red,6018
2672,446,red,4788
2673,446,red,4774

...he then corrected the SQL code but forgot to update the answer



antman 13-05-2016 16:33

Re: Jaci's Annual FRC Datadump 2016
 
Question for Ether or anyone else interested: is there a simple way using awk or other tools to get information about streaks from relational data like this? I've always resorted to writing a program (VB, T-SQL, java etc) because the SQL gets too ugly. For example: longest winning streak for each team (crossing events). It would be hard to do with this data currently because the event dates are not included but easy enough to add event_date field to the events table. To simplify my question, assuming id in the matches table was in chronological order for each team, how would you approach getting each team's longest winning streak?

jvriezen 13-05-2016 16:44

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by Ether (Post 1586491)
...he then corrected the SQL code but forgot to update the answer

Fixed.

jvriezen 13-05-2016 16:47

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by antman (Post 1586502)
Question for Ether or anyone else interested: is there a simple way using awk or other tools to get information about streaks from relational data like this? I've always resorted to writing a program (VB, T-SQL, java etc) because the SQL gets too ugly. For example: longest winning streak for each team (crossing events). It would be hard to do with this data currently because the event dates are not included but easy enough to add event_date field to the events table. To simplify my question, assuming id in the matches table was in chronological order for each team, how would you approach getting each team's longest winning streak?

I think adding a 'sequence' column to the event table would allow you to sort a team's matches in chronological order, Week 0 events would have the lowest sequence through Einstein having the highest. Still would not be easy to from there with SQL, though.

GeeTwo 13-05-2016 17:19

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by antman (Post 1586502)
Question for Ether or anyone else interested: is there a simple way using awk or other tools to get information about streaks from relational data like this? I've always resorted to writing a program (VB, T-SQL, java etc) because the SQL gets too ugly. For example: longest winning streak for each team (crossing events). It would be hard to do with this data currently because the event dates are not included but easy enough to add event_date field to the events table. To simplify my question, assuming id in the matches table was in chronological order for each team, how would you approach getting each team's longest winning streak?

SQL doesn't do sequential queries (streaks) very well. AFAIR, it doesn't recognize the order of tuples (records) within a relation (table), and determining that two matches were "sequential for a given team" would be quite convoluted without procedural logic.

***********************

If the matches were sorted as you indicated (guaranteed that the matches for each team are in chronological order), which would not be too difficult to arrange, it would be a simple matter in awk or other scripting language to create arrays indexed on each team number:
  • long_start (start of the longest streak)
  • long_length (length of the longest streak)
  • curr_start (start of the current streak)
  • curr_length (length of the current streak)

Then, for each match, extend (or begin) the streak for each winner, and terminate the streak for each loser, taking care to update long_* from curr_* if curr_length[team] > long_length[team]. At the end of Einstein, close out all of the teams who won their last match (that is, curr_length>0).

The trickiest/finickiest part would probably be initializing the arrays, unless you decided to brute force it and have cells for teams which no longer exist or otherwise did not compete this year.

Ether 13-05-2016 17:28

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by antman (Post 1586502)
longest winning streak for each team (crossing events).

I'd feed the *Qmatches.csv and *Pmatches.csv files*, in chrono order, to an AWK script something like this:
Code:


if ($11>$14) f1(5,8); else f1(8,5);

function f1(W,L){
        for(k=W;k<=W+2;k++)
                streak[$k]++;
        for(k=L;k<=L+2;k++){
                if(streak[$k]>max[$k])max[$k]=streak[$k];
                streak[$k]=0;
                }
        }


* http://www.chiefdelphi.com/media/papers/3243


Jaci 13-05-2016 22:00

Re: Jaci's Annual FRC Datadump 2016
 
Quote:

Originally Posted by jvriezen (Post 1586427)
Hmm... Franks blog post claims there were 13,303 matches played, but the matches table has only 13,302 rows.

Clearly there is something going on here and someone is hiding the data for a match that they don't want made public :D

All the data in the matches table is taken directly from TheBlueAlliance and you can see that for yourself in the `populate.rb` file. If you run it now, it will give even more matches because of offseason events.

Either TBA's missed a match or Frank's number is wrong, because I can assure you the data in the table is unaltered.

Ether 13-05-2016 23:50

Re: Jaci's Annual FRC Datadump 2016
 
1 Attachment(s)
Quote:

Originally Posted by Ether (Post 1586516)
I'd feed the *Qmatches.csv and *Pmatches.csv files*, in chrono order, to an AWK script something like this...

OK, ran the script.


All times are GMT -5. The time now is 02:56.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi