library(stringr)
## Warning: package 'stringr' was built under R version 3.3.3
data <- "tournamentinfo.txt"

dat <- readLines(data)

head(dat, 33)
##  [1] "-----------------------------------------------------------------------------------------" 
##  [2] " Pair | Player Name                     |Total|Round|Round|Round|Round|Round|Round|Round| "
##  [3] " Num  | USCF ID / Rtg (Pre->Post)       | Pts |  1  |  2  |  3  |  4  |  5  |  6  |  7  | "
##  [4] "-----------------------------------------------------------------------------------------" 
##  [5] "    1 | GARY HUA                        |6.0  |W  39|W  21|W  18|W  14|W   7|D  12|D   4|" 
##  [6] "   ON | 15445895 / R: 1794   ->1817     |N:2  |W    |B    |W    |B    |W    |B    |W    |" 
##  [7] "-----------------------------------------------------------------------------------------" 
##  [8] "    2 | DAKSHESH DARURI                 |6.0  |W  63|W  58|L   4|W  17|W  16|W  20|W   7|" 
##  [9] "   MI | 14598900 / R: 1553   ->1663     |N:2  |B    |W    |B    |W    |B    |W    |B    |" 
## [10] "-----------------------------------------------------------------------------------------" 
## [11] "    3 | ADITYA BAJAJ                    |6.0  |L   8|W  61|W  25|W  21|W  11|W  13|W  12|" 
## [12] "   MI | 14959604 / R: 1384   ->1640     |N:2  |W    |B    |W    |B    |W    |B    |W    |" 
## [13] "-----------------------------------------------------------------------------------------" 
## [14] "    4 | PATRICK H SCHILLING             |5.5  |W  23|D  28|W   2|W  26|D   5|W  19|D   1|" 
## [15] "   MI | 12616049 / R: 1716   ->1744     |N:2  |W    |B    |W    |B    |W    |B    |B    |" 
## [16] "-----------------------------------------------------------------------------------------" 
## [17] "    5 | HANSHI ZUO                      |5.5  |W  45|W  37|D  12|D  13|D   4|W  14|W  17|" 
## [18] "   MI | 14601533 / R: 1655   ->1690     |N:2  |B    |W    |B    |W    |B    |W    |B    |" 
## [19] "-----------------------------------------------------------------------------------------" 
## [20] "    6 | HANSEN SONG                     |5.0  |W  34|D  29|L  11|W  35|D  10|W  27|W  21|" 
## [21] "   OH | 15055204 / R: 1686   ->1687     |N:3  |W    |B    |W    |B    |B    |W    |B    |" 
## [22] "-----------------------------------------------------------------------------------------" 
## [23] "    7 | GARY DEE SWATHELL               |5.0  |W  57|W  46|W  13|W  11|L   1|W   9|L   2|" 
## [24] "   MI | 11146376 / R: 1649   ->1673     |N:3  |W    |B    |W    |B    |B    |W    |W    |" 
## [25] "-----------------------------------------------------------------------------------------" 
## [26] "    8 | EZEKIEL HOUGHTON                |5.0  |W   3|W  32|L  14|L   9|W  47|W  28|W  19|" 
## [27] "   MI | 15142253 / R: 1641P17->1657P24  |N:3  |B    |W    |B    |W    |B    |W    |W    |" 
## [28] "-----------------------------------------------------------------------------------------" 
## [29] "    9 | STEFANO LEE                     |5.0  |W  25|L  18|W  59|W   8|W  26|L   7|W  20|" 
## [30] "   ON | 14954524 / R: 1411   ->1564     |N:2  |W    |B    |W    |B    |W    |B    |B    |" 
## [31] "-----------------------------------------------------------------------------------------" 
## [32] "   10 | ANVIT RAO                       |5.0  |D  16|L  19|W  55|W  31|D   6|W  25|W  18|" 
## [33] "   MI | 14150362 / R: 1365   ->1544     |N:3  |W    |W    |B    |B    |W    |B    |W    |"

Split the file into two tables by odd and even rows with the sequence function.

chessA <- dat[seq(5,195,3)]
head(chessA, 10)
##  [1] "    1 | GARY HUA                        |6.0  |W  39|W  21|W  18|W  14|W   7|D  12|D   4|"
##  [2] "    2 | DAKSHESH DARURI                 |6.0  |W  63|W  58|L   4|W  17|W  16|W  20|W   7|"
##  [3] "    3 | ADITYA BAJAJ                    |6.0  |L   8|W  61|W  25|W  21|W  11|W  13|W  12|"
##  [4] "    4 | PATRICK H SCHILLING             |5.5  |W  23|D  28|W   2|W  26|D   5|W  19|D   1|"
##  [5] "    5 | HANSHI ZUO                      |5.5  |W  45|W  37|D  12|D  13|D   4|W  14|W  17|"
##  [6] "    6 | HANSEN SONG                     |5.0  |W  34|D  29|L  11|W  35|D  10|W  27|W  21|"
##  [7] "    7 | GARY DEE SWATHELL               |5.0  |W  57|W  46|W  13|W  11|L   1|W   9|L   2|"
##  [8] "    8 | EZEKIEL HOUGHTON                |5.0  |W   3|W  32|L  14|L   9|W  47|W  28|W  19|"
##  [9] "    9 | STEFANO LEE                     |5.0  |W  25|L  18|W  59|W   8|W  26|L   7|W  20|"
## [10] "   10 | ANVIT RAO                       |5.0  |D  16|L  19|W  55|W  31|D   6|W  25|W  18|"
chessB <- dat[seq(6,196,3)]
head(chessB, 10)
##  [1] "   ON | 15445895 / R: 1794   ->1817     |N:2  |W    |B    |W    |B    |W    |B    |W    |"
##  [2] "   MI | 14598900 / R: 1553   ->1663     |N:2  |B    |W    |B    |W    |B    |W    |B    |"
##  [3] "   MI | 14959604 / R: 1384   ->1640     |N:2  |W    |B    |W    |B    |W    |B    |W    |"
##  [4] "   MI | 12616049 / R: 1716   ->1744     |N:2  |W    |B    |W    |B    |W    |B    |B    |"
##  [5] "   MI | 14601533 / R: 1655   ->1690     |N:2  |B    |W    |B    |W    |B    |W    |B    |"
##  [6] "   OH | 15055204 / R: 1686   ->1687     |N:3  |W    |B    |W    |B    |B    |W    |B    |"
##  [7] "   MI | 11146376 / R: 1649   ->1673     |N:3  |W    |B    |W    |B    |B    |W    |W    |"
##  [8] "   MI | 15142253 / R: 1641P17->1657P24  |N:3  |B    |W    |B    |W    |B    |W    |W    |"
##  [9] "   ON | 14954524 / R: 1411   ->1564     |N:2  |W    |B    |W    |B    |W    |B    |B    |"
## [10] "   MI | 14150362 / R: 1365   ->1544     |N:3  |W    |W    |B    |B    |W    |B    |W    |"

Extract the name using str_extract_all on the odd rows. Use unlist to vectorize the output and str_trim to clean up the empty space.

name <- str_trim(unlist(str_extract_all(chessA,'[A-Z]+ [A-Z]+ ([A-Z-]+)? ([A-Z]+)?')))
head(name, 10)
##  [1] "GARY HUA"            "DAKSHESH DARURI"     "ADITYA BAJAJ"       
##  [4] "PATRICK H SCHILLING" "HANSHI ZUO"          "HANSEN SONG"        
##  [7] "GARY DEE SWATHELL"   "EZEKIEL HOUGHTON"    "STEFANO LEE"        
## [10] "ANVIT RAO"

Extract the total pts using str_extract_all on the odd rows. Use unlist to vectorize the output and make it numeric.

total <- as.numeric(unlist(str_extract_all(chessA, "\\d\\.\\d")))
head(total, 10)
##  [1] 6.0 6.0 6.0 5.5 5.5 5.0 5.0 5.0 5.0 5.0

Extract the state using str_extract_all on the even rows. Use unlist to vectorize the output and use str_trim to clean up the empty space.

state <- str_trim(unlist(str_extract_all(chessB, "\\s[A-Z]{2}\\ ")))
head(state, 10)
##  [1] "ON" "MI" "MI" "MI" "MI" "OH" "MI" "MI" "ON" "MI"

Extract the player prerating using str_extract_all. Use unlist to vectorize the output. Complete a second pass of clean up and make it numeric.

prerate <- unlist(str_extract_all(chessB, ":\\s+\\d{3,4}"))
prerate <- as.numeric(unlist(str_extract_all(prerate, "\\d{1,4}")))
head(prerate, 10)
##  [1] 1794 1553 1384 1716 1655 1686 1649 1641 1411 1365

Describing the for loop:

The tables have 64 rows. For each row:

step 1: extract the W,D, or L and opponent number from each row

step 2: clean up the W,D, or L and spacing using str_replace, and make number numeric

step 3: extract the player rating of the row number assigned to each of the values of step 2

step 4: clean up the extraction with str_replace_all and make opponent ratings numeric

step 5: sum up the row of opponent ratings and divide by the amount of opponents

opp.rate <- vector()

for (i in 1:64){
  
  s1 <- unlist(str_extract_all(chessA[i], "(W|D|L)\\s+(\\d)+"))
  
  s2 <- as.numeric(str_replace_all(s1, "(W|D|L)\\s+", ""))
  
  s3 <- str_extract(chessB[s2[1:length(s2)]], ":\\s+\\d{3,4}")
  
  s4 <- as.numeric(str_replace_all(s3, ":\\s+", ""))
  
  s5 <- round(sum(s4)/length(s4))
  
  opp.rate <- c(opp.rate, s5)
}

head(opp.rate, 10)
##  [1] 1605 1469 1564 1574 1501 1519 1372 1468 1523 1554

Create a data frame with the five columns created above

chess_df <- data.frame(
                      PlayerName = name, 
                      State = state, 
                      TotalPts = total, 
                      AvgPrerating = prerate,                         
                      OppAvgPrerating = opp.rate
            )

chess_df
##                    PlayerName State TotalPts AvgPrerating OppAvgPrerating
## 1                    GARY HUA    ON      6.0         1794            1605
## 2             DAKSHESH DARURI    MI      6.0         1553            1469
## 3                ADITYA BAJAJ    MI      6.0         1384            1564
## 4         PATRICK H SCHILLING    MI      5.5         1716            1574
## 5                  HANSHI ZUO    MI      5.5         1655            1501
## 6                 HANSEN SONG    OH      5.0         1686            1519
## 7           GARY DEE SWATHELL    MI      5.0         1649            1372
## 8            EZEKIEL HOUGHTON    MI      5.0         1641            1468
## 9                 STEFANO LEE    ON      5.0         1411            1523
## 10                  ANVIT RAO    MI      5.0         1365            1554
## 11   CAMERON WILLIAM MC LEMAN    MI      4.5         1712            1468
## 12             KENNETH J TACK    MI      4.5         1663            1506
## 13          TORRANCE HENRY JR    MI      4.5         1666            1498
## 14               BRADLEY SHAW    MI      4.5         1610            1515
## 15     ZACHARY JAMES HOUGHTON    MI      4.5         1220            1484
## 16               MIKE NIKITIN    MI      4.0         1604            1386
## 17         RONALD GRZEGORCZYK    MI      4.0         1629            1499
## 18              DAVID SUNDEEN    MI      4.0         1600            1480
## 19               DIPANKAR ROY    MI      4.0         1564            1426
## 20                JASON ZHENG    MI      4.0         1595            1411
## 21              DINH DANG BUI    ON      4.0         1563            1470
## 22           EUGENE L MCCLURE    MI      4.0         1555            1300
## 23                   ALAN BUI    ON      4.0         1363            1214
## 24          MICHAEL R ALDRICH    MI      4.0         1229            1357
## 25           LOREN SCHWIEBERT    MI      3.5         1745            1363
## 26                    MAX ZHU    ON      3.5         1579            1507
## 27             GAURAV GIDWANI    MI      3.5         1552            1222
## 28 SOFIA ADINA STANESCU-BELLU    MI      3.5         1507            1522
## 29           CHIEDOZIE OKORIE    MI      3.5         1602            1314
## 30         GEORGE AVERY JONES    ON      3.5         1522            1144
## 31               RISHI SHETTY    MI      3.5         1494            1260
## 32      JOSHUA PHILIP MATHEWS    ON      3.5         1441            1379
## 33                    JADE GE    MI      3.5         1449            1277
## 34     MICHAEL JEFFERY THOMAS    MI      3.5         1399            1375
## 35           JOSHUA DAVID LEE    MI      3.5         1438            1150
## 36              SIDDHARTH JHA    MI      3.5         1355            1388
## 37       AMIYATOSH PWNANANDAM    MI      3.5          980            1385
## 38                  BRIAN LIU    MI      3.0         1423            1539
## 39              JOEL R HENDON    MI      3.0         1436            1430
## 40               FOREST ZHANG    MI      3.0         1348            1391
## 41        KYLE WILLIAM MURPHY    MI      3.0         1403            1248
## 42                   JARED GE    MI      3.0         1332            1150
## 43          ROBERT GLEN VASEY    MI      3.0         1283            1107
## 44         JUSTIN D SCHILLING    MI      3.0         1199            1327
## 45                  DEREK YAN    MI      3.0         1242            1152
## 46   JACOB ALEXANDER LAVALLEY    MI      3.0          377            1358
## 47                ERIC WRIGHT    MI      2.5         1362            1392
## 48               DANIEL KHAIN    MI      2.5         1382            1356
## 49           MICHAEL J MARTIN    MI      2.5         1291            1286
## 50                 SHIVAM JHA    MI      2.5         1056            1296
## 51             TEJAS AYYAGARI    MI      2.5         1011            1356
## 52                  ETHAN GUO    MI      2.5          935            1495
## 53              JOSE C YBARRA    MI      2.0         1393            1345
## 54                LARRY HODGE    MI      2.0         1270            1206
## 55                  ALEX KONG    MI      2.0         1186            1406
## 56               MARISA RICCI    MI      2.0         1153            1414
## 57                 MICHAEL LU    MI      2.0         1092            1363
## 58               VIRAJ MOHILE    MI      2.0          917            1391
## 59          SEAN M MC CORMICK    MI      2.0          853            1319
## 60                 JULIA SHEN    MI      1.5          967            1330
## 61              JEZZEL FARKAS    ON      1.5          955            1327
## 62              ASHWIN BALAJI    MI      1.0         1530            1186
## 63       THOMAS JOSEPH HOSMER    MI      1.0         1175            1350
## 64                     BEN LI    MI      1.0         1163            1263

Write to csv and remove the row numbers

write.csv(chess_df, file = "tournamenttable.csv", row.names = FALSE)