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

Posted

技术标签:

【中文标题】读取 txt 文件的行并组织在 JSON 文件中【英文标题】:Read lines of a txt file and organize in a JSON file 【发布时间】:2019-01-08 10:41:24 【问题描述】:

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

示例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 文件中?

【问题讨论】:

【参考方案1】:

如果您不想自己处理解析 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);

【讨论】:

在哪里可以找到有关如何使用 csv 解析器的文档?特别是 parser.on("data") 和 "end" 行【参考方案2】:

如果您的 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), )

【讨论】:

【参考方案3】:

使用RegExpArray#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');

对于较大的文件,请考虑按照@zhangjinzhou 的建议在 Node.js 中使用 Streams

【讨论】:

以上是关于读取 txt 文件的行并组织在 JSON 文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何在文本文件中查找行并导出行号

使用 Bash 读取文件中的行并避免使用 # 行

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

C ++从文本文件中读取行并编辑

如果单词退出,则删除行并在powershell中打印具有两个单词的行之间的所有行