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

javascript代码,用于提取带特定关键字的大括号中的值,javascript,regex,loops,google-bigquery,google-cloud-storage,Javascript,Regex,Loops,Google Bigquery,Google Cloud Storage,我在谷歌云存储中有一组文本文件(每5分钟[批处理]就会有新文件进入存储)。我想做的是通过数据流将其放入GoogleBigQuery。在dataflow中,我们可以直接将云存储中的文本文件导入到GoogleBigQuery(在我的例子中,我需要批处理)。它需要一个javascript代码将GCS中的文本文件转换为bigquery中的表。 这是我的一个文本文件的示例 我想写javascript代码到选择主题名为Bat,并将大括号之间的值写入Bigquery表。根据上面的示例,下面是必需的。(Big

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

我想写javascript代码到选择主题名为Bat,并将大括号之间的值写入Bigquery表。根据上面的示例,下面是必需的。(Bigquery模式将在后面添加)

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

下面是我尝试的。(如果这是错误的,请修复)

提前感谢

让new=line.match(paramsPattern)

您不应将其分配给新变量。。。新的是特别的

这是一个适用于您的示例的正则表达式:

以下是一个例子:

const testLine='Topic:Bat[0]位于偏移量:216812{“ID”:51255125,“NAME”:6}';
函数变换(直线){
常量参数=/({[\s\s]+})/g;
常量匹配=行匹配(paramsPattern);
if(line.indexOf('Bat')=-1)
返回null;
如果(匹配===null)
返回null;
//这将验证json是否有效(它将抛出),但如果确定匹配[0]有效,则可以跳过此操作并直接返回匹配[0]
返回JSON.stringify(JSON.parse(match[0]);
}

log(转换(testLine))如果涉及到可靠性、便利性和/或可维护性,人们应该考虑一种更通用的方法,它可以列出行/字符串,此外还可以通过组装正确的正则表达式

const fileData=`
主题:偏移量为216712{“ID”:55689534,“NAME”:6}处的Cat[0]
主题:偏移量为216719{“ID”:55689524,“NAME”:6}处的Cat[1]
主题:Bat[0]偏移量:216716{“代码”:94762151097,“年龄”:32}
主题:偏移量为216713{“ID”:55689524,“NAME”:6}处的Cat[0]
主题:Bat[1]偏移量:216723{“代码”:947080272531,“年龄”:43}
主题:偏移量:216738{“ID”:55689525,“NAME”:6}处的Cat[1]
`;
const dataItemList=fileData.split(/\n/);
函数getTopicSpecificDataCaptureRegX(主题){
//另见:[https://regex101.com/r/AD31R6/1/]
//返回(/^\s*Topic\s*\:\s*Bat[^{]+(\{.*\})\s*$/);
//返回(/^\s*Topic\s*\:\s*Cat[^{]+(\{.*\})\s*$/);
返回RegExp('^\\s*Topic\\s*\\:\\s*'+Topic+'[^{]+(\\{.\\\})\\s*$);
}
函数CollectTopicSpecificCDATA(收集器,dataItem){
const result=dataItem.match(collector.regX);
如果(结果!==null){
collector.list.push(JSON.parse(result[1]);
}
回程收集器;
}
console.log(
““Cat”特定数据列表:”,
dataItemList.reduce(CollectTopicSpecificCDATA{
regX:getTopicSpecificDataCaptureRegX('Cat'),
名单:[]
}).名单
);
console.log(
““Bat”特定数据列表:”,
dataItemList.reduce(CollectTopicSpecificCDATA{
regX:getTopicSpecificDataCaptureRegX('Bat'),
名单:[]
}).名单
);

.as-console-wrapper{min-height:100%!important;top:0;}
谢谢@stefantigro。我只想在主题名为“Bat”时选择行(忽略其他主题名)。要做到这一点,必须在主题后获取单词:如果该单词等于Bat,则选择该行。(忽略所有其他主题名)我已经编辑了我的答案,行吗?除了“Bat”,你还可以做
line.indexOf('Topic:Bat')==-1
非常感谢。添加此部分后我会检查。var obj=new Object();obj.ID=values[0];obj.AGE=values[1];您不需要添加该部分。检索到的数据已经是有效的JSON。而且这可能不起作用,因为我的正则表达式选择了大括号的所有内容。为什么要执行
var obj=new Object();obj.ID=values[0];obj.AGE=values[1]
?@kevin…考虑到任何基于
索引的方法来确定特定主题都是容易出错的…例如
Bat
Bats
Battery
Cat
Cats
cating
。应该有一个至少检查主题键值pa的正则表达式ttern与
if((/Topic:Bat\s+/).test(line)){…}
类似。
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;
}