【问题标题】:Push every new match from regEx in array将正则表达式中的每个新匹配推送到数组中
【发布时间】:2017-04-08 20:58:46
【问题描述】:

我尝试使用以下代码解析一些 xml 文件:

   function parseXml() {
      var url = 'http://www.inpo.ru/documents/pricelists/pricelist.xml';
      var xml = UrlFetchApp.fetch(url).getContentText();

      var parseregexp = new RegExp (/.*em><no>(\d+)<\/no><title>(.+?)<\/title><price vat="\w+">(\d+.\d+|\d+)<\/price><unit>(.+?)<\/unit><free>(\d+)<\/free>(.|\s)*?<it/g)
      var parsedData = '$1 $2 $3 $4 $5 '
      var rangeRegex = [];

      var Pdata = xml.replace(parseregexp,parsedData)

      var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
      ss.getRange(1, 1).setValue(Pdata)
      }

这里是xml片段:

<item><no>48514</no><title>The workpiece is the rod d 8x150mm P6AM5 HRC 64-66" CNIC"</title><price vat="yes">154.58</price><unit>Pcs</unit><free>59</free><remarks>Used to make an axial tool.
Hardness HRC64-66</remarks><img thumbnail="http://www.inpo.ru/index/I:48528/THUMBNAIL:0.jpg">http://www.inpo.ru/index/I: 48528 / PREVIEW: 0.jpg</img></item><item><no>48515</no><title>The workpiece is the rod d 8x200mm P6AM5 HRC 64-66"CNIC"</title><price vat="Yes">198.24</price><unit>pcs</unit><free>32</free><remarks>Used to make an axial tool.
Hardness HRC64-66</remarks><img thumbnail="http://www.inpo.ru/index/I:48528/THUMBNAIL:0.jpg">http://www.inpo.ru/index/I: 48528 / PREVIEW: 0.jpg</img></item>

Pdata 中的结果是:

48514 The workpiece is the rod d 8x150mm P6AM5 HRC 64-66" CNIC" 154.58 Pcs 59 48515 The workpiece is the rod d 8x200mm P6AM5 HRC 64-66"CNIC" 198.24 pcs 32

在 Pdata 的这个例子中,我有 1 个来自所有正则表达式匹配的长字符串。如何从所有匹配项中创建一个包含 5 列的数组?我认为用“for”循环将每场比赛推向阵列,但不知道它是如何制作的。很高兴为您提供任何帮助

【问题讨论】:

  • 您应该发布分配给变量Pdata 的值。否则我们必须运行你的代码。我们不应该那样做。看来您可能需要将数据拆分为数组中的元素。
  • @SandyGood 是的,你是对的,我在问题中添加了它
  • 要在哪里拆分内容?在 48514 和 48515?
  • 我想将 48514 和 48515 存储在单元格 A2 和 A3 中。接下来的比赛从 $2 $3 $4 $5 全在 B2 C2 D2 E2 和 B3 C3 D3 E3
  • 你玩腻了吗! Xmlservice

标签: arrays regex google-apps-script


【解决方案1】:

替代解决方案: 由于您正在尝试访问 xml 数据,您可以使用 XMLservice.parser

但是 fetch 调用似乎有问题,我无法获取整个数据 (fetch 给出了一个截断的文件,可能是超时,16mb 文件),所以我下载了数据文件并将其上传到谷歌驱动器。 该文件可用于解析 XML 数据,如下所示:

function parseXml() {

      var file = DriveApp.getFileById("Xml File ID")   //Get the id of the uploaded file and replace it for "Xml File ID"
      var xml = file.getBlob().getDataAsString()
      // The below code gave a error for XML parser
     /*var url = 'http://www.inpo.ru/documents/pricelists/pricelist.xml';
       var options = {
       'method' : 'get',
       'contentType': 'application/xml',
       }
      var xml = UrlFetchApp.fetch(url,options).getBlob().getDataAsString()
      Logger.log(xml)*/
     // End of code with gave an error

 var arrayItems = []
 var XmlElem = ["no","title","price","unit","free"]       //Elements to look for
 var document = XmlService.parse(xml);
 var RCounter = 0
 var groups = document.getRootElement().getChildren();   //GetGroup Element
    for(var k = 0; k< groups.length; k++){               // Loop through each group element
      var main = groups[k].getChildren()                // Get sub groups in each group
  for (var j=0 ; j < main.length; j++){                 // Loop through each subGroups

   var mainChilds = main[j].getChildren()               //Get items in each subGroups
   for (var l = 0 ; l < mainChilds.length; l++){        // Loop through each items
   var items = mainChilds[l].getChildren();             // Get  elemetns like "no","title","price","units","free" in each item 
     arrayItems[RCounter] = []
   var total = 0;
    for (var i = 0; i < items.length; i++) {
     // Logger.log(items[i].getName())
      var index = XmlElem.indexOf(items[i].getName())       //Look for items and place the value at corresponding index
      if(index != -1)
        arrayItems[RCounter][index] = items[i].getValue()
     }  //End Loope for elements
     if(arrayItems[RCounter].length > 0)                   //in case the array is empty, reuse it
      RCounter++
    }   // End loop for items
    }   // End loop for sub Groups
    }   // End loop for Groups
  Logger.log(arrayItems) 
}

希望对您有所帮助!

【讨论】:

  • 是的,它运行良好,谢谢杰克!结合下载功能,它为刷新数据提供了很好的工具。但我只有一个问题,如果我只是更改 XmlElem var,此代码是否适用于其他具有不同结构的 xml 文件?
  • 如果 XML 文件的结构保持不变,是的!上述解决方案寻找以下结构 {group} {group}{item}{XML element}{/item}{/group}{/group}
  • 嘿,杰克!您创建的脚本直到今天都运行良好。我有一个错误:XML 文档结构必须在同一个实体内开始和结束。 (在字符串:“var document = XmlService.parse(xml);”)我假设文件加载时可能会出现错误,将来如何避免它?如果这让您感到困难,那么如果我的评论仍未得到答复也没关系
猜你喜欢
  • 2020-02-17
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2015-12-25
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多