javascript - 如何将 txt 文件中的数据转换为 Node 中的对象数组
问题描述
我是 Node 新手,我有一个包含这样数据的文本文件
Date Open High Low Close Volume
11-Jun-19 163.3 164.54 162.74 163.1 158470476
10-Jun-19 165.31 165.4 164.37 164.8 105667060
7-Jun-19 163.85 164.95 163.14 164.8 188337725
...
我想创建一个这样的对象数组
[{
Date: "11-Jun-19",
Open: 163.22,
High: 164.28,
Low: 163.05,
Close: 163.88,
Volume: 5854647
}, {
Date: "12-Jun-19",
Open: 163.22,
High: 164.28,
Low: 163.05,
Close: 163.88,
Volume: 5854647
}, {
Date: "15-Jun-19",
Open: 163.22,
High: 164.28,
Low: 163.05,
Close: 163.88,
Volume: 5854647
}]
我怎样才能做到这一点?这是我的尝试:
const lineReader = require('line-reader');
lineReader.eachLine('input.txt', function (line) {
let results = [];
let divide = line.split(" ");
for (let i = 0; i < divide.length; i++) {
let field = divide[i].split("/t");
results.push({
date: field[0],
open: field[1],
high: field[2],
low: field[3],
close: field[4],
volume: field[5]
});
}
console.log(results);
});
但这会为每个对象创建一个数组,我得到的所有数据date
如下所示:
[
{
date: '11-Jun-19\t163.3\t164.54\t162.74\t163.1\t158470476',
open: undefined,
high: undefined,
low: undefined,
close: undefined,
volume: undefined
}
]
[
{
date: '10-Jun-19\t165.31\t165.4\t164.37\t164.8\t105667060',
open: undefined,
high: undefined,
low: undefined,
close: undefined,
volume: undefined
}
]
...
解决方案
顺便说一下,如果您的文件很大并且您确实需要逐行处理,您可以尝试readline
内部模块(参见此示例):
const fs = require('fs');
const readline = require('readline');
async function processLineByLine() {
const fileStream = fs.createReadStream('test.txt');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity,
});
let headers = null;
const data = [];
for await (const line of rl) {
const row = line.split(/\s+/);
if (headers === null) { // So this is the first line.
headers = row;
} else {
const entry = {};
for (let i = 0; i < row.length; i++) {
const header = headers[i];
const cell = row[i];
entry[header] = header === 'Date' ? cell : Number(cell);
// Or more generally:
// const mayBeNumber = Number(cell);
// entry[header] = Number.isNaN(mayBeNumber) ? cell : mayBeNumber;
}
data.push(entry);
}
}
console.log(data);
}
processLineByLine();
推荐阅读
- r - 仅转换(随机播放)数据框中的 2 个字段
- angularjs - 警告:尝试仅在网络服务器上多次加载 Angular
- sql - 如何在 PostgreSQL 中对包含星号的 VARCHAR 列进行排序
- sql - SQL - 基于动态日期范围的动态总和
- c# - 如何使用 SMO for .NET 恢复多个事务日志
- android - 使用 Android Studio 启动一个新的 Android 项目
- c# - Bot Framework V3 电子邮件 Json 对象
- python - python响应 - 并非所有请求都已执行
- php - 禁用自动购物车/checkout_update 添加手动选项以在下订单前进行更新
- python - 如何找到最新的照片并打开它 - Photo Booth