读取 txt 文件的行并组织在 JSON 文件中

Read lines of a txt file and organize in a JSON file

我有一个文本文件,其中每一行由冒号分隔为 4 个类别,我想将其放入 JSON 文件中,其中每个类别都是 [=24] 中相应名称的值=] 文件。

示例 data.txt 文件:

Date1:cat1:dog1:bug1
Date2:cat2:dog2:bug2
Date3:cat3:dog3:bug3

示例 JSON 文件:

{
  "Date1": {
    "cat": "cat1",
    "dog": "dog1",
    "bug": "bug1"
  },
  "Date2": {
    "cat": "cat2",
    "dog": "dog2",
    "bug": "bug2"
    ...
  ...
}

我以前从未使用过 JSON,但我认为这就是格式化它的方式。我将如何使用冒号作为下一个值的标记对每一行进行排序,并使用 JavaScript 和 Node.js?

将其以正确的名称存储在 JSON 文件中

如果您不想自己处理解析 csv 文件,请使用 csv 包。

const fs = require("fs");
const csv = require("csv");

const result = {};
const keys = ["cat", "dog", "bug"]

// Read data
const readStream = fs.createReadStream("yourfile.txt");

// Parser
const parser = csv.parse({ delimiter: ":" });

parser.on("data", (chunk) => {
result[chunk[0]] = {};
    for(let i = 1; i < chunk.length; i ++) {
        result[chunk[0]][keys[i - 1]] = chunk[i];
    }
});

parser.on("end", () => {
    console.log(result);
});

readStream.pipe(parser);

如果您的 JSON 具有此定义的结构,您可以使用以下代码进行处理:

import * as fs from 'fs';

/* If you have a large file this is a bad Idea, refer to reading from a stream 
 * From zhangjinzhou's answer
 */
const file = fs.readFileSync('path/to/data.txt', 'utf8');

const json = file.split(/\n|\r\n/).map(line => {
  const values = line.split(":");
  let obj = {}

  obj[values[0]] =  {
    cat: values[1],
    dog: values[2],
    bug: values[3],
  };

  return obj
}).reduce((acc, current) => Object.assign(acc, current), {})

使用 RegExp and Array#forEach,将字符串转换为行,然后遍历它们并通过以下方式用相应的数据填充 object

const dataFileContent = 
`Date1:cat1:dog1:bug1
Date2:cat2:dog2:bug2
Date3:cat3:dog3:bug3`;

function processData(data) {
  // convert to lines
  const lines = data.match(/[^\r\n]+/g) || [];  
  const object = {};
  
  // iterate over the lines
  lines.forEach(line => {
    const parts = line.split(':');    
    const main = parts.shift();
    const pattern = /^(.*?)(\d+)$/;
    
    // create an object for each main part
    object[main] = {};    
    
    // fill each main part with the sub parts
    parts.forEach(part => {
      const match = part.match(pattern) || [];
      const key = match[1];
      const value = match[2];
            
      if (match) {
        object[main][key] = key + value;
      }
    });
  }); 
  
  return object;
}

const processedData = processData(dataFileContent);
console.log(processedData);

然后使用 JSON.stringifyprocessedData 转换为 JSON 并通过以下方式将其保存到文件:

const fs = require('fs');

...
// processData
...

const json = JSON.stringify(processedData);
fs.writeFile('my_json_file.json', json, 'utf8');

对于较大的文件,请考虑使用 Streams in Node.js as suggested by