【问题标题】:javascript code to extract values in curly braces with specific keyword in linejavascript代码提取带有特定关键字的花括号中的值
【发布时间】:2020-08-07 08:11:23
【问题描述】:

我在 Google 云存储中有一组文本文件(新文件每 5 分钟存储一次[批处理])。我想做的是通过 Dataflow 将其放入 Google BigQuery 中。在数据流中,我们可以直接将云存储中的文本文件导入 Google BigQuery(在我的情况下我想要批处理)。它需要一个 javascript 代码来将 GCS 中的文本文件转换为 bigquery 中的表。 这是我的一个文本文件的示例。

我想编写 javascript 代码 选择主题名称为 Bat 并将大括号之间的值放入 Bigquery 表中。根据上面的示例,下面是必需的。( BigQuery 架构稍后会添加)

我对javascript真的很陌生(实际上这是第一次),我想实现一个javascript函数来做到这一点。我不知道在行中选择主题名称Bat**。

以下是我尝试过的。(请修正,如果这是错误的)

function transform(line) {

const paramsPattern = /[^{\}]+(?=})/g;
let new = line.match(paramsPattern);

var values = new.split(',');

var obj = new Object();
obj.ID = values[0];
obj.AGE = values[1];

var jsonString = JSON.stringify(obj);

return jsonString;
}

提前致谢!!!

【问题讨论】:

    标签: javascript regex loops google-bigquery google-cloud-storage


    【解决方案1】:

    如果涉及到可靠性、便利性和/或可维护性,人们应该考虑一种更通用的方法,通过组合正确的正则表达式来执行 reduce 行/字符串列表以及 takes even a specific topic into account ...

    const fileData = `
      Topic:Cat [0] at offset:216712{"ID":55689534,"NAME":6}
      Topic:Cat [1] at offset:216719{"ID":55689524,"NAME":6}
        Topic : Bat [0] at offset:216716  {"CODE":94762151097,"AGE":32}  
      Topic:Cat [0] at offset:216713{"ID":55689524,"NAME":6}
      Topic:Bat [1] at offset:216723{"CODE":947080272531,"AGE":43}
      Topic:Cat [1] at offset:216738{"ID":55689525,"NAME":6}
    `;
    const dataItemList = fileData.split(/\n/);
    
    
    function getTopicSpecificDataCaptureRegX(topic) {
    // see also: [https://regex101.com/r/AD31R6/1/]
    
    //return (/^\s*Topic\s*\:\s*Bat[^{]+(\{.*\})\s*$/);
    //return (/^\s*Topic\s*\:\s*Cat[^{]+(\{.*\})\s*$/);
      return RegExp('^\\s*Topic\\s*\\:\\s*' + topic + '[^{]+(\\{.*\\})\\s*$');
    }
    
    function collectTopicSpecificData(collector, dataItem) {
      const result = dataItem.match(collector.regX);
      if (result !== null) {
    
        collector.list.push(JSON.parse(result[1]));
      }
      return collector;
    }
    
    
    console.log(
      '"Cat" specific data list : ',
      dataItemList.reduce(collectTopicSpecificData, {
    
        regX: getTopicSpecificDataCaptureRegX('Cat'),
        list: []
    
      }).list
    );
    console.log(
      '"Bat" specific data list : ',
      dataItemList.reduce(collectTopicSpecificData, {
    
        regX: getTopicSpecificDataCaptureRegX('Bat'),
        list: []
    
      }).list
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      【解决方案2】:

      让 new = line.match(paramsPattern);

      你不应该把它分配给一个变量 new...new 是特殊的。

      这是一个适用于您的示例的正则表达式:https://regex101.com/r/tBHRIY/1

      这是一个例子:

      const testLine  = 'Topic:Bat [0] at offset:216812{"ID":51255125, "NAME":6}';
      
      function transform(line) {
          const paramsPattern = /({[\s\S]+})/g;
          const match         = line.match( paramsPattern );
      
          if ( line.indexOf( 'Bat' ) === -1 )
              return null;
      
          if ( match === null )
              return null;
      
          // This will verify that the json is valid ( it will throw ) but you can skip this and return match[0] directly if you are sure it is valid
          return JSON.stringify( JSON.parse( match[0] ) );
      }
      
      console.log( transform( testLine ) );

      编辑:抱歉,我错过了检查 BAT,添加了

      【讨论】:

      • 感谢@stefantigro。如果主题名称为“Bat”,我只想选择行。(忽略其他主题名称)。为此,必须在 Topic 之后获取单词:如果该单词等于 Bat,则选择该行。(忽略所有其他主题名称)
      • 我已经编辑了我的答案,可以吗?除了“蝙蝠”之外,您还可以使用line.indexOf( 'Topic:Bat' ) === -1
      • 非常感谢。我会在添加这部分后检查。 var obj = 新对象(); obj.ID = 值[0]; obj.AGE = 值[1];
      • 您不需要添加该部分。检索到的数据已经是有效的 JSON。这也可能不起作用,因为我的正则表达式选择了花括号的所有内容。为什么要做var obj = new Object(); obj.ID = values[0]; obj.AGE = values[1]
      • @kevin ... 考虑到任何基于indexOf 的确定特定主题的方法都容易出错...例如BatBatsBatteryCatCatsCatering。至少应该有一个正则表达式来检查主题的键值模式,例如if ((/Topic:Bat\s+/).test(line)) { ... }
      猜你喜欢
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多