将 2 列文本文件转换为键/值对 [关闭]

问题描述 投票:0回答:1

我目前正在学习 Node.js 和 Express。我正在尝试将文本文件转换为键值对。

我的楼梯程序是这样工作的:

description

提供的文本文件如下所示(有 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...

是否有更优雅的方法将提供的文本数据转换为键/值对?

请原谅我刚刚使用的术语,如果我遗漏了一些重要的内容,请索取更多信息。

javascript node.js arrays npm
1个回答
-1
投票

不需要 dataToJson 库,并且你的 create_staircase 函数的逻辑有些不清楚:

  • 您正在增加步骤并根据步骤从 nums 进行切片,但 if-else 块内的逻辑似乎过于复杂。
  • 您似乎使用
    splice()
    以不断增长的速度从数组中删除元素,但条件包含以非典型方式修改 nums 和subsets 的逻辑。

您是否尝试批量显示或处理大小不断增加的数据?

这里不要使用find,如果dataInJSON很大,效率不高,因为它执行线性搜索。

温馨提示:

  • 直接使用fs解析文件并用空格分割。
  • 简化楼梯逻辑以增量显示更多数据。
  • 通过使用排序键来删除重复搜索。

更高效/改进的代码:

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!`);
});
© www.soinside.com 2019 - 2024. All rights reserved.