gpt4 book ai didi

javascript - Node : Return array of arrays from dialog openDirectory

转载 作者:行者123 更新时间:2023-12-03 12:37:44 26 4
gpt4 key购买 nike

我正在使用 Electron 桌面应用程序,我需要做的是:

  • 使用“dialog.showOpenDialog”打开一个目录。
  • 按扩展名过滤文件。
  • 读取过滤文件(它们没有标题)。
  • 将它们解析为列并仅返回第 4 列和第 6 列(坐标)。
  • 返回所有文件的数组数组(最后的输出示例)。

  • 以我对 js 的一点了解,这是我到目前为止的代码,我被困在第 4 点:
    document.getElementById('btn-readfile').addEventListener('click', () => {

    dialog.showOpenDialog({
    properties: ['openDirectory']
    }).then(function(response) {
    if (!response.canceled) {
    dirname = response.filePaths[0] + '\\'
    var fs = require('fs');
    var path = require('path');

    function readFiles(dirname, onFileContent, onError) {
    fs.readdir(dirname, function(err, files) {
    if (err) {
    onError(err);
    return;
    }
    filesList = files.filter(function(e) {
    return path.extname(e).toLowerCase() === '.txt' // ==> Filter files by extension
    });
    filesList.forEach(function(filesList) {
    fs.readFile(dirname + filesList, 'utf-8', function(err, content) {
    if (err) {
    onError(err);
    return;
    }

    onFileContent(filesList, content);

    });
    });
    });
    }
    var data = {};
    readFiles(dirname, function(filesList, content) {
    data[filesList] = content;
    console.log(data[filesList]);
    }, function(err) {
    throw err;
    });
    } else {
    console.log("no file selected");
    }
    });
    }, false);

    原始文件:
    -1  2021-01-20  08:11:19    43.30981408167  N   13.73270596167  E   1.08    M   4
    -1 2021-01-20 08:11:20 43.30981406000 N 13.73270596333 E 1.07 M 4
    -1 2021-01-20 08:11:21 43.30981403667 N 13.73270598333 E 1.07 M 4
    -1 2021-01-20 08:11:22 43.30981403833 N 13.73270598500 E 1.07 M 4
    1 2021-01-20 08:11:23 43.30981406333 N 13.73270597333 E 1.07 M 4
    2 2021-01-20 08:11:24 43.30981404833 N 13.73270598167 E 1.07 M 4
    3 2021-01-20 08:11:25 43.30981459167 N 13.73270569667 E 1.08 M 4
    9 2021-01-20 08:11:26 43.30981820000 N 13.73270345667 E 1.07 M 4


    所需输出: 数组数组,其中每个数组代表文件夹中每个文件的第 4 列和第 6 列。

    var latlng = [
    [
    [ 45.64172279, 10.19579398],
    [ 45.64193714, 10.1958776],
    [ 45.64220345, 10.19598908],
    [ 45.6423983, 10.19606341],
    [ 45.6429504, 10.19632354],
    [ 45.64329464, 10.19658367],
    [ 45.64341805, 10.19758703]
    ],
    [
    [ 45.64339856, 10.19838601],
    [ 45.64313876, 10.1987855],
    [ 45.64244377, 10.19869259],
    [ 45.6418527, 10.19879479],
    [ 45.6415669, 10.19715967],
    [ 45.64170331, 10.19648147],
    [ 45.64189167, 10.19615631]
    ]
    ];

    最佳答案

    不要将所有内容都塞进事件处理程序中,因为它不可重用并且具有可怕的可维护性。制作接管任务基本部分的功能。
    首先,顶级依赖关系到顶部。

    const fs = require('fs');
    const path = require('path');
    读取目录并返回文件名数组的 promise 的函数:
    function getFilesAsync(dirname) {
    return new Promise((resolve, reject) => {
    fs.readdir(dirname, function(err, files) {
    if (err) reject(err); else resolve(files);
    });
    });
    }
    一个接受文件名和可选编码的函数,并返回文件内容的 promise :
    function getFileContentAsync(filename, encoding) {
    return new Promise((resolve, reject) => {
    fs.readFile(filename, {encoding: encoding}, function (err, content) {
    if (err) reject (err); else resolve(content);
    });
    });
    }
    一个函数,它获取一 block 文本并将其拆分为特定位置的行和列(因为您的数据使用固定宽度的列):
    function splitFixedColumnData(text, positions) {
    return text.split('\n').map(line =>
    positions.concat(line.length).map( (pos, i) =>
    line.substring(positions[i-1] || 0, pos).trim() // from the previous to the current column pos
    )
    );
    }
    还有一个从数组中挑选某些元素的函数,因此您可以从前一个函数返回的更大的列集中选择要使用的列:
    function pluckArray(arr, indexes) {
    return arr.reduce((result, v, i) => {
    if (indexes.includes(i)) result.push(v);
    return result;
    }, []);
    }
    在定义了所有这些之后,我们可以将它们组合起来做一些有用的事情:
    document.getElementById('btn-readfile').addEventListener('click', async () => {
    let dlg = await dialog.showOpenDialog({
    properties: ['openDirectory']
    });
    if (dlg.canceled) {
    console.log("no file selected");
    return;
    }

    try {
    let txtFiles = (await getFilesAsync(root))
    .filter(fn => path.extname(fn).toLowerCase() === '.txx')
    .map(fn => path.join(root, fn));
    let pendingContents = txtFiles.map(fn => getFileContentAsync(fn, 'utf-8'));
    let contents = await Promise.all(pendingContents);
    let columnData = contents.map(text => splitFixedColumnData(text, [4, 16, 28, 44, 48, 64, 68, 76, 80]));
    let latlng = columnData.map(rows => rows.map(row => pluckArray(row, [3, 5])));

    for (let i = 0; i < txtFiles.length; i++) {
    console.log(txtFiles[i], latlng[i]);
    }
    } catch (err) {
    console.log(err);
    }
    }, false);

    关于javascript - Node : Return array of arrays from dialog openDirectory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65858334/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com