Tengo una aplicación en desarrollo usando Nodejs
. Esta aplicación realiza una solicitud a la API de GitLab y obtiene los datos del archivo sin procesar.
Me gustaría leer la cadena particular que está presente después de otra cadena y obtener todos los datos similares de ella. Estoy un poco confundido en esta parte y no puedo continuar, ¿alguien puede explicarme cómo lograr esto?
Los siguientes son los datos del archivo de muestra: Me gustaría leer todos los números si están presentes después de la palabra clave Scenario:
es decir, en este caso me gustaría obtener A001-D002 & K002-M002
. Estos números pueden ser aleatorios y pueden aparecer en cualquier parte del contenido del archivo. Me gustaría leerlos y almacenarlos dentro de una matriz para ese archivo en particular.
FileName: File Data Background: This is some random background Scenario: A001-D002 My first scenario Given I am sitting on a plane When I am offered drinks Scenario: K002-M002 My second scenario Given when I book the uber taxi When I get the notifications
No entiendo cómo iterar sobre el contenido del archivo y leer cada palabra y coincidencia y, en consecuencia, obtener las identificaciones.
El siguiente es el código que tengo que realiza la solicitud a GitLab y obtiene el contenido del archivo sin procesar: ./index.js
:
const express = require('express'); const http = require("http"); const bodyParser = require('body-parser'); const app = express(); const port = process.env.PORT || 9000; const gitlabDump = require("./controller/GitLabDump"); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); //Make NodeJS to Listen to a particular Port in Localhost app.listen(port, function(){ gitlabDump.gitlabDump(type, function(data){ console.log("Completed Execution for GitLab") process.exit(); }) }
Mi ./controller/GitLabDump.js
:
const request = require('request'); const https = require('https'); const axios = require('axios'); exports.gitlabDump = function(callback){ var gitlabAPI = "https://gitlab.com/api/v4/projects/<project_id>/repository/files/tree/<subfolders>/<fileName>/raw?ref=master&private_token=<privateToken>"; //Make the request to the each file and read its raw contents request(gitlabAPI, function(error, response, body) { const featureFileData = JSON.parse(JSON.stringify(body)).toString(); console.log(featureFileData) for(const match of featureFileData.matchAll("Scenario:")){ console.log(match); } callback("Completed"); }) }
Puedo imprimir el contenido del archivo. ¿Puede alguien explicarme cómo puedo iterar sobre el contenido del archivo sin procesar y obtener todas las identificaciones requeridas?
Le sugiero que use un método analizando cada parte de su cadena iterando sobre cada línea (supongo que su cadena está compuesta como en su ejemplo). Es más fácil entenderlo y codificarlo que usar una expresión regular.
El siguiente ejemplo representa su función de devolución de llamada de request
. Dividí el código en 3 lógicas:
Después de eso, puede cambiar fácilmente su filtro de ID ( txt.substr(0, txt.indexOf(' ')
) para usar una expresión más adecuada para extraer su oración.
El resultado se envía a una función de devolución de llamada con como primer argumento el nombre del archivo y como segundo argumento todos los identificadores. Como lo hiciste en tu ejemplo.
((callback) => { const featureFileData = `FileName: File Data Background: This is some random background Scenario: A001-D002 My first scenario Given I am sitting on a plane When I am offered drinks Scenario: K002-M002 My second scenario Given when I book the uber taxi When I get the notifications`; // find "filename" const filenames = featureFileData.split('\n') .filter(line => line.trim().substr(0,8) === 'FileName') .map((raw) => { if(!raw) return 'unknown'; const sentences = raw.trim().split(':'); if(sentences[1] && sentences[1].length) { return sentences[1].trim(); } }); // filter the "Scenario" lines const scenarioLines = featureFileData.split('\n') .map((line) => { if(line.trim().substr(0,8) === 'Scenario') { const sentences = line.trim().split(':'); if(sentences[1] && sentences[1].length) { return sentences[1].trim(); } } return false; }) .filter(r => r !== false); // search ids const ids = scenarioLines.map(txt => txt.substr(0, txt.indexOf(' '))); callback(filenames[0], ids); })(console.log)