【问题标题】:How do convert/parse/extract data from a PGN into a spreadsheet/google sheet/excel file?如何将 PGN 中的数据转换/解析/提取到电子表格/Google 工作表/Excel 文件中?
【发布时间】:2021-07-24 11:58:26
【问题描述】:

这个问题的后续:Live statistics chess960 from chess.com?

所以假设我去喜欢

https://api.chess.com/pub/player/gmwso/games/2020/12

https://api.chess.com/pub/player/gmwso/games/2020/12/pgn

会有一堆像说这样的东西

[UTCDate "2018.01.03"]
[WhiteElo "2706"]
[BlackElo "2940"]

如何将这些数据放入电子表格中,例如第 1 列是所有日期,第 2 列是对应的白色 elo,第 3 列是黑色 elo,col4 白色用户名和 col5 黑色用户名?


更新 2:现已修复。请参阅“json”与“预制”。哇。

更新 1:似乎 Mike Steelson 有一个答案 here,其中代码为

=arrayformula( regexextract(split( substitute(substitute(substitute(getDataJSON(A1;"/games";"/pgn");"[";"");"]";"");"""";"") ;char(10));"\s.*") )

这里有一个例子

https://docs.google.com/spreadsheets/d/1MX1o5qdy0K3gTMzbimUV3SmFf-0XPCSJ8Vz4IjI-8Ak/copy

仅涉及 chess960 的情况似乎存在问题。考虑例如this player:用玩家的用户名替换'gmwso'会产生奇怪的输出。我想混合 chess960 和国际象棋的输出会更混乱。

【问题讨论】:

  • 请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。然后查看help center 看看你可以问什么问题。请显示您尝试过的尝试以及您从尝试中得到的问题/错误消息。
  • @Progman 这是什么欢迎堆栈溢出?我在该网站上的第一篇文章是 7 年前。你是反对者吗?
  • @BCLC ...这是一个巨大的挑战!从 json 中获取数据很容易,更难的是从列中获取数据。我会看看它。大问题。
  • 确保我的 regexextract 公式可以改进!

标签: extract chess data-extraction information-extraction lichess


【解决方案1】:

来自 lichess.org,假设 pgn 文件已加载到您的驱动器中(如果我直接从 lichess.org 捕获信息,谷歌警报“超过最大执行时间”)

// Mike Steelson

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('↓ lichess.org ↓')
    .addItem('parse PGN file from Drive', 'readPGNFromDrive')
    .addToUi();
}

function readPGNFromDrive() {

  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('from drive')
  var id = sh.getRange('B1').getValue()
  var list = ['Event', 'Site', 'Date', 'White', 'Black', 'Result', 'UTCDate', 'UTCTime', 'WhiteElo', 'BlackElo', 'WhiteRatingDiff', 'BlackRatingDiff', 'Variant', 'TimeControl', 'ECO', 'Termination', 'FEN', 'SetUp', 'sequence']

  sh.deleteRows(2,sh.getLastRow()+2)
  var result=[]
  result.push(list)
  var data = DriveApp.getFileById(id).getBlob().getDataAsString().split(String.fromCharCode(10,10,10))
  for (var i=0; i<data.length; i++) {
    var prov=[]
    var parts = data[i].split(String.fromCharCode(10,10))
    var pparts = parts[0].split(String.fromCharCode(10))
    for (var x=0; x<pparts.length; x++){
      pparts[x]=pparts[x].replace('[','"').replace(']','').replace(' "','":"') // "key":"value"
    }
    var donnees = JSON.parse('{'+pparts.join(',')+'}') // mise au format json
    list.forEach(function(path){
      if (path == 'sequence'){prov.push(parts[1])}
      else {prov.push(donnees.item(path))}
    })
    result.push(prov)
  }
  sh.getRange(2,1,result.length,result[0].length).setValues(result)
}

Object.prototype.item=function(i){return this[i]};

https://docs.google.com/spreadsheets/d/1ZX-YefSfeNx0z6mo7Bo3EY_tOkYcVLT7Ke0fqQUiHNI/copy

【讨论】:

  • 感谢一百万迈克·斯蒂尔森!从谷歌驱动器获取:完美!!!从 lichess 那里得到,像 chessdotcom 那样一次只做 1 个月怎么样?例如,这就是我为aug2021提供的内容@
  • 与上一个答案相同,复制docs.google.com/spreadsheets/d/… 并选择tab pgn 文件,将url 放入A1 并调整第2 行(已经完成)
  • 我明天将研究如何检索文件中包含的不同信息(如事件、日期、白色、黑色......)。然后你会得到一套完整的新脚本。
  • 明天做什么?看起来它已经完成了。所以是的,实际上只是所有游戏都返回“超过最大执行时间”,但看起来一次只能运行一个月?
  • 由于不同的来源有不同的数据,我会尝试检索它,所以你不必填写第2行
猜你喜欢
  • 2020-07-19
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多