我目前正在学习 Node.js 和 Express。我正在尝试将文本文件转换为键值对。
我的楼梯程序是这样工作的:
提供的文本文件如下所示(有 300 行):
我想要一个转换来创建一个或多或少看起来像这样的数组:
{283: 'land'}
{45: 'sun'}
{149: 'too'}
{258: 'huge'}
{161: 'dont'}`
第一列项目成为键,第二列项目成为值。这个结果将成为一个常量,我可以在其中调用数字(键)并获取单词(值)。
我已成功转换为 JSON,标题位于列顶部,然后删除所有不需要的信息,只得到数字和单词。
我必须编辑文本文件以制作完美间隔的列并添加标题:
json_num json_word
283 land
45 sun
149 too
258 huge
161 dont...
我正在使用的代码:
const express = require("express");
const dataToJson = require("data-to-json");
const app = express();
const port = "3000";
const dataInJSON = dataToJson.txt({ filePath: "./coding_qual_input.txt" }).toJson();
console.log(dataInJSON)
const dataLength = dataInJSON.length;
function create_staircase(nums) {
var subsets = [];
var step = 1;
while (nums.length !== 0) {
if (step === subsets.length+1) {
subsets = nums.slice(0, step);
const value = (dataInJSON.find((dataInJSON) => dataInJSON.json_num == (subsets[step-1])));
console.log(value.json_num, value.json_word);
nums.splice(0, step);
step++;
} else {
subsets = nums.splice(0, subsets.length+1);
nums.splice(0, step);
step++;
}
}
}
const arrayRange = (start, stop, step) =>
Array.from(
{ length: (stop - start) / step + 1 },
(value, index) => start + index * step
);
create_staircase(arrayRange(1, dataLength, 1));
app.listen(port, () => {
console.log(`Battleship ${port} Cats listening, over!`);
});
结果大致是这样的:
1 design
3 all
6 skill
10 whole
15 check
21 deal
28 wish
36 visit...
是否有更优雅的方法将提供的文本数据转换为键/值对?
请原谅我刚刚使用的术语,如果我遗漏了一些重要的内容,请索取更多信息。
不需要 dataToJson 库,并且你的 create_staircase 函数的逻辑有些不清楚:
splice()
以不断增长的速度从数组中删除元素,但条件包含以非典型方式修改 nums 和subsets 的逻辑。您是否尝试批量显示或处理大小不断增加的数据?
这里不要使用find,如果dataInJSON很大,效率不高,因为它执行线性搜索。
温馨提示:
更高效/改进的代码:
const fs = require('fs');
const express = require('express');
const app = express();
const port = 3000;
function convertFileToJSON(filePath) {
const fileContent = fs.readFileSync(filePath, 'utf8');
const lines = fileContent.split('\n');
const result = {};
lines.forEach(line => {
// remove leading/trailing whitespace, split string into an array of substrings (one of more spaces)
const parts = line.trim().split(/\s+/);
if (parts.length === 2) {
result[parts[0]] = parts[1];
}
});
return result;
}
const dataInJSON = convertFileToJSON('./coding_qual_input.txt');
const keys = Object.keys(dataInJSON).map(Number).sort((a, b) => a - b);
function createStaircase(keys) {
let step = 1;
let index = 0;
while (index < keys.length) {
const subset = keys.slice(index, index + step);
subset.forEach(key => {
console.log(`${key}: ${dataInJSON[key]}`);
});
index += step;
step++;
}
}
createStaircase(keys);
app.listen(port, () => {
console.log(`Battleship ${port} Cats listening, over!`);
});