为了账号安全,请及时绑定邮箱和手机立即绑定

在nodejs中将txt文件转换为json

在nodejs中将txt文件转换为json

撒科打诨 2022-11-27 17:13:06
我有一个.txt由管道分隔数据组成的文件。如下图。HEADER1|HEADER2|HEADER3Value1|Value2|Value3Value4|Value5|Value6Value7|Value8|Value9我希望能够从文本文件中返回如下所示的对象数组。[  { HEADER1: 'Value1', HEADER2: "Value2", HEADER3: 'Value3' },  { HEADER1: 'Value4', HEADER2: "Value5", HEADER3: 'Value6' },  { HEADER1: 'Value7', HEADER2: "Value8", HEADER3: 'Value9' }]我怎样才能做到这一点?
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

好吧,简单的方法是这样的:


// Raw data

const raw = `HEADER1|HEADER2|HEADER3

Value1|Value2|Value3

Value4|Value5|Value6

Value7|Value8|Value9`;


// Or load raw data from file

const fs = require('fs');

const raw = (fs.readFileSync('file.txt')).toString();


// Split data by lines

const data = raw.split('\n');


// Extract array of headers and

// cut it from data

const headers = (data.shift()).split('|');


// Define target JSON array

let json = [];


// Loop data

for(let i = 0; i < data.length; i++) {

  // Remove empty lines

  if(/^\s*$/.test(data[i])) continue;

  // Split data line on cells

  const contentCells = data[i].split('|');

  // Loop cells

  let jsonLine = {};

  for(let i = 0; i < contentCells.length; i++) jsonLine[headers[i]] = contentCells[i];

  // Push new line to json array

  json.push(jsonLine);

}


// Result

console.log(json);

例子在这里


查看完整回答
反对 回复 2022-11-27
?
慕村9548890

TA贡献1884条经验 获得超4个赞

看看csv2json。您可以使用管道作为自定义分隔符



查看完整回答
反对 回复 2022-11-27
?
喵喔喔

TA贡献1735条经验 获得超5个赞

一个名为readline的核心模块将是最好的选择

const fs = require('fs');

const readline = require('readline');


async function processLineByLine() {

  const fileStream = fs.createReadStream('input.txt');


  const rl = readline.createInterface({

    input: fileStream,

    crlfDelay: Infinity

  });

  // Note: we use the crlfDelay option to recognize all instances of CR LF

  // ('\r\n') in input.txt as a single line break.


  const finalResult = [];

  let keys = [];

  let i = 0;

  for await (const line of rl) {

     //Extract first line as keys

     if(i === 0) keys = line.split('|');

     else {

        const lineArray = line.split('|');

        const result = keys.reduce((o, k, i) => ({...o, [k]: lineArray[i]}), {});

       // Or try

       // result = Object.assign(...keys.map((k, i) => ({[k]: lineArray[i]})));


      // Or

      // let result = {};

      // keys.forEach((key, i) => result[key] = lineArray[i]);


        finalResult.push(result);

        console.log(result);

     }

     i++;


  }

  return finalResult;

}


processLineByLine();


查看完整回答
反对 回复 2022-11-27
  • 3 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信