【问题标题】:To split by date and event columns按日期和事件列拆分
【发布时间】:2021-04-24 19:05:48
【问题描述】:

我正在尝试按日期和事件列进行拆分。搜索“.”是不可能的,有些行包含多个以“.”结尾的句子,另外,有些行不以日期开头。该脚本的想法是使用正则表达式查找以片段“一个或两个数字、空格、字母、句点、空格”开头的行,然后将“点、空格”替换为稀有字符,例如“ @"。如果该行不以此片段开头,则在开头添加“@”。然后这个数组可以很容易地被这个符号(“@”)分成两部分并写入工作表。

很遗憾,今天出了点问题。我发现match(re) 始终是null。我请求帮助编写正确的正则表达式并解决问题。

原文:

6 月 1 日。天文学家报告缩小了快速无线电的来源 突发 (FRB)。它现在可能包括“紧凑对象合并 和正常核心坍缩超新星产生的磁星”。[3][4]

芬兰证实中子星存在夸克核 [5][6][7]

6 月 3 日。研究人员表明,与农村人口相比,城市红 伦敦的狐狸(如图)反映了驯化的模式 类似于驯养的狗,因为它们适应了他们的城市 [21]

发现最古老和最大的结构 玛雅地区,一个拥有 3000 年历史的金字塔顶平台 Aguada 据报道,Fénix 采用了 LiDAR 技术。

6 月 17 日。 XENON 暗物质研究机构的物理学家报告 超过 53 个事件,这可能暗示存在 假设的太阳轴子。

想要的结果:

代码:

function replace() {
  const sheetName = "Sheet1";
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const lr = sheet.getLastRow();
  // const range = sheet.getRange(2, 4, lr - 1);
  const range = sheet.getRange(100, 4, 5);
  const arr = range.getValues();
  const newArr = [];
  const re = new RegExp("^([0-9]{1,2}\s[a-z]+\.)\s");

  for (let i = 0; i < arr.length; i++) {
    const match = arr[i][0].match(re);
    if (match == null) {
      let newEntry = "@" + arr[i];
      newArr.push(newEntry);
    } else {
      // let newEntry = "#" + arr[i];
      // newArr.push(newEntry);
    }
  }
  // range.offset(0,1).setValues(newArr);
  //  console.log(newArr);
}

【问题讨论】:

  • 请注意,使用常规字符串文字设置的正则表达式需要正确转义。它必须是 new RegExp("^([0-9]{1,2}\\s[a-z]+\\.)\\s")/^([0-9]{1,2}\s[a-z]+\.)\s/
  • 妈妈咪呀!你是绝对正确的!我不能在比赛中坐好几天。谢谢。
  • 如何替换“.”的问题带有“@”(“else {}”中的部分代码)仍未解决。

标签: regex google-apps-script


【解决方案1】:
function breakapart() {
  const ms = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');//Data Sheet
  const osh = ss.getSheetByName('Sheet2');//Output Sheet
  osh.clearContents();
  const vs = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getDisplayValues().flat();
  let oA = [];
  vs.forEach(p => {
    let f = p.split(/[. ]/);
    if (!isNaN(f[0]) && ms.includes(f[1])) {
      let s = p.slice(0, p.indexOf('.'));
      let t = p.slice(p.indexOf('.')+2);
      oA.push([s, t]);
    } else {
      oA.push(['',p]);
    }
  });
  osh.getRange(1,1,oA.length,oA[0].length).setValues(oA);
}

【讨论】:

  • 感谢工作脚本!你采取了不同的方法。不幸的是,这会产生一个稍微出乎意料的结果。 link
  • 我不熟悉那个链接,所以我不会关注它
  • 对不起。结果有截图。起初我看到有重复的行。然后我意识到这是因为在我的原始工作表中不仅有原始文本的列,而且还有所需的结果。当我删除这些列时,一切都很好。谢谢!
猜你喜欢
  • 2016-08-06
  • 2010-09-09
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多