首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NODEJS:从对话框openDirectory返回数组

NODEJS:从对话框openDirectory返回数组
EN

Stack Overflow用户
提问于 2021-01-23 10:52:33
回答 1查看 50关注 0票数 0

我在一个电子桌面应用程序中工作,我需要做的是:

使用'dialog.showOpenDialog'.

  • Filter打开一个目录--通过extension.

  • Read过滤的文件(它们没有头)。

  • 将它们解析为列,并只返回列4和6 (coordinates).

  • Return --所有文件的数组(最后的输出示例)。

,我对js有一点了解,到目前为止,这是我的代码,我被困在第4点:

代码语言:javascript
复制
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);

原始文件:

代码语言:javascript
复制
-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。

代码语言:javascript
复制
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]
                ]
            ];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-23 12:09:20

不要将所有东西都塞进事件处理程序中,这是不可重用的,并且具有可怕的可维护性。使功能接管您的任务的基本部分。

首先,顶层依赖项位于顶部.

代码语言:javascript
复制
const fs = require('fs');
const path = require('path');

读取目录并返回文件名数组的承诺的函数:

代码语言:javascript
复制
function getFilesAsync(dirname) {
    return new Promise((resolve, reject) => {
        fs.readdir(dirname, function(err, files) {
            if (err) reject(err); else resolve(files);
        });
    });
}

一个函数,它接受文件名和可选编码,并返回对文件内容的承诺:

代码语言:javascript
复制
function getFileContentAsync(filename, encoding) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, {encoding: encoding}, function (err, content) {
            if (err) reject (err); else resolve(content);
        });
    });
}

一个函数,它接受一个文本块并在特定位置将其拆分为行和列(因为您的数据使用固定宽度的列):

代码语言:javascript
复制
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
        )
    );
}

以及从数组中提取某些元素的函数,这样您就可以从前面函数返回的更大的列集合中选择要处理的列:

代码语言:javascript
复制
function pluckArray(arr, indexes) {
    return arr.reduce((result, v, i) => {
        if (indexes.includes(i)) result.push(v);
        return result;
    }, []);
}

有了所有这些定义,我们可以把它们结合起来做一些有用的事情:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65858334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档