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

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

http://img2.mukewang.com/63a403040001003f06470112.jpg

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

http://img.mukewang.com/63a4030b0001676303360088.jpg

我真的是 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;

}

提前致谢 !!!


慕姐4208626
浏览 151回答 2
2回答

弑天下

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

不负相思意

让 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,已添加
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript