我在一个电子桌面应用程序中工作,我需要做的是:
使用'dialog.showOpenDialog'.
,我对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]
]
];发布于 2021-01-23 12:09:20
不要将所有东西都塞进事件处理程序中,这是不可重用的,并且具有可怕的可维护性。使功能接管您的任务的基本部分。
首先,顶层依赖项位于顶部.
const fs = require('fs');
const path = require('path');读取目录并返回文件名数组的承诺的函数:
function getFilesAsync(dirname) {
return new Promise((resolve, reject) => {
fs.readdir(dirname, function(err, files) {
if (err) reject(err); else resolve(files);
});
});
}一个函数,它接受文件名和可选编码,并返回对文件内容的承诺:
function getFileContentAsync(filename, encoding) {
return new Promise((resolve, reject) => {
fs.readFile(filename, {encoding: encoding}, function (err, content) {
if (err) reject (err); else resolve(content);
});
});
}一个函数,它接受一个文本块并在特定位置将其拆分为行和列(因为您的数据使用固定宽度的列):
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);https://stackoverflow.com/questions/65858334
复制相似问题