javascript код для извлечения значений в фигурных скобках с указанием c ключевого слова в строке - PullRequest
0 голосов
/ 07 августа 2020

У меня есть набор текстовых файлов в облачном хранилище Google (новые файлы поступают в хранилище каждые 5 минут [пакетная обработка]). я хочу поместить его в Google BigQuery через Dataflow. В потоке данных мы можем напрямую импортировать текстовые файлы из облачного хранилища в Google BigQuery (в моем случае мне нужна пакетная обработка). Для преобразования текстовых файлов в GCS в таблицу в bigquery требуется код javascript. Вот мой образец одного текстового файла.

enter image description here

I want to write javascript code to select topic name is Bat and the values between curly braces into Bigquery table.According to above sample below is the required one.(BigQuery schema will be added later)

введите описание изображения здесь

Я действительно новичок в javascript (на самом деле это первый раз), и я хочу реализовать для этого функцию javascript. Я не знаю, выберите имя c topi Bat ** in 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;
}

Заранее спасибо !!!

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Если дело касается надежности, а также удобства и / или ремонтопригодности, следует подумать о более общем c подходе, который сокращает список строк / строк и, кроме того, принимает даже указанный c topi c в счет путем сборки правильного регулярного выражения ...

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; }
0 голосов
/ 07 августа 2020

let 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, добавил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...