JS: текстовый файл в JSON - PullRequest
0 голосов
/ 17 мая 2018

Я полный новичок в JS и нуждаюсь в некоторой помощи.У меня есть текстовый файл, похожий на этот:

JOBID,NAME,USER,NODELIST,CPUS,STATE,REASON
2527,_DP-2-Q-095-84-1-50.job,loe_mk,,4,PENDING,launch failed requeued held
2528,_Q-095-76-2-05.job,fr_tho,,4,PENDING,launch failed requeued held
2515,_DC-3-V-095-76-0-10.job,pi_tim,node01,4,RUNNING,None

Итак, JOBID, NAME и т. Д. Являются именами для значений ниже.

Теперь я хочу разобрать его в объект JSON.Я пытался сделать это так:

var jdata = new Array();
jdata = data.toString().split('\n');
jsonstring = JSON.stringify(jdata);
fs.writeFile('out/data.json', jsObj, (err) => {
  if (err) throw err;
});

Но результат не является объектом JSON, верно?Мне как-то нужно прикрепить параметры подключения друг к другу, чтобы это выглядело так:

{
    "JOBID": 2527,
    "NAME": '_DP-2-Q-095-84-1-50.job',
    ...
}

Кто-нибудь может подсказать мне, как правильно преобразовать это, или это вообще невозможно?

Спасибо уже

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Вы правы в том, что вам нужно преобразовать свои данные, прежде чем они станут правильным объектом JSON.

Это способ сделать это (с немного более современным Javascript):

const data = `JOBID,NAME,USER,NODELIST,CPUS,STATE,REASON
        2527,_DP-2-Q-095-84-1-50.job,loe_mk,,4,PENDING,launch failed requeued held
        2528,_Q-095-76-2-05.job,fr_tho,,4,PENDING,launch failed requeued held
        2515,_DC-3-V-095-76-0-10.job,pi_tim,node01,4,RUNNING,None
    `;

let lines = data.split('\n');
const headers = lines.shift().split(',');

// convert the individual lines to JSON objects
const jsonData = lines.map(line => {
  const parts = line.split(',');

  // Invalid lines - these are filtered out later
  if (parts.length !== headers.length) {
    return false;
  }

  // look up the name of the part from the header and use that as the property name
  return parts.reduce((acc, part, index) => ({
    ...acc,
    [headers[index]]: part,
  }), {});
}).filter(Boolean); // remove the invalid objects

console.log(jsonData);
0 голосов
/ 17 мая 2018

Вы начали правильно, но вы не можете просто использовать JSON.stringify(jdata); для преобразования в JSON.Пример в чистом JS выглядит так:

//Load in Input
var input = `JOBID,NAME,USER,NODELIST,CPUS,STATE,REASON
2527,_DP-2-Q-095-84-1-50.job,loe_mk,,4,PENDING,launch failed requeued held
2528,_Q-095-76-2-05.job,fr_tho,,4,PENDING,launch failed requeued held
2515,_DC-3-V-095-76-0-10.job,pi_tim,node01,4,RUNNING,None`;

//Split into Lines
var data = input.split("\n");
//Get all the header values
var header = input.split("\n")[0].split(",");

//Init Output Array
var output = [];

//For every row except the first (1...n)
for(var i=1;i<data.length;i++){
    //Get all the values
    var values = data[i].split(",");
    var obj = {};

    //For every value in the header
    for(var j=0;j<header.length;j++){
        //obj[JOBID] = 2527
        obj[header[j]] = values[j];
    }

    //Push to output
    output.push(obj);
}

Вывод теперь будет равен вашему массиву объектов.Затем вы можете сохранить его как раньше.

// [{"JobID": 2527, "...},{..}...]
jsonstring = JSON.stringify(output);
fs.writeFile('out/data.json', jsObj, (err) => {
  if (err) throw err;
});
0 голосов
/ 17 мая 2018

Вот простой подход, и вы можете изменить его в соответствии с вашими потребностями

var data = 'JOBID,NAME,USER,NODELIST,CPUS,STATE,REASON\n'
+'2527,_DP-2-Q-095-84-1-50.job,loe_mk,,4,PENDING,launch failed requeued held\n'+
'2528,_Q-095-76-2-05.job,fr_tho,,4,PENDING,launch failed requeued held\n'+
'2515,_DC-3-V-095-76-0-10.job,pi_tim,node01,4,RUNNING,None';
var spdata = data.split('\n');
//assuming that the first row is always having columns names
var names = spdata[0].split(',');
var mainDataAr=[];
//reading data from the 2nd row
for(var i=1;i<spdata.length;i++)
{
  //taking the data from the row at position i
  var rdata = spdata[i].split(',');
  var obj={};
  for(var j=0;j<names.length;j++)
  {   
   obj[names[j]]=rdata[j]   
  }
  mainDataAr.push(obj);
}
console.log(mainDataAr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...