读取 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】:使用RegExp 和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.stringify 将 processedData
转换为 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 文件中的主要内容,如果未能解决你的问题,请参考以下文章
如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?