为了账号安全,请及时绑定邮箱和手机立即绑定

javascript代码提取带有特定关键字的大括号中的值

javascript代码提取带有特定关键字的大括号中的值

慕姐4208626 2022-12-22 15:10:40
我在谷歌云存储中有一组文本文件(新文件每 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;}提前致谢 !!!
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

如果涉及到可靠性、便利性和/或可维护性,人们应该考虑一种更通用的方法,它确实减少了行/字符串列表,此外还通过组装正确的正则表达式来考虑特定主题......

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; }


查看完整回答
反对 回复 2022-12-22
?
不负相思意

TA贡献1777条经验 获得超10个赞

让 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,已添加


查看完整回答
反对 回复 2022-12-22
  • 2 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信