我是nodejs的新手,并尝试编写一个程序来读取csv文件,并可以通过列名从csv_file中选择数据并将其转换为数组。
我想出了如何读取csv文件并将列转换为数组的方法(感谢Internet),但是这些列是通过索引号而不是名称来选择的。
代码:
var csv = require('csv');
var csv_obj = csv();
function Column_data(signal_name, signal_type, initial_value, minimum, maximum ) {
this.signal_name = signal_name;
this.signal_type = signal_type;
this.initial_value = initial_value;
this.minimum = minimum;
this.maximum = maximum;
};
var csv_data = [];
csv_obj.from.path('../data_files/Signals_Info.csv).to.array(function (data) {
for (var row = 0; row < data.length; index++) {
csv_data.push(new Column_data(data[row][0], data[row][1], data[row][2], data[row][3], data[row][4]));
}
console.log(csv_data);
});
在这里,我使用索引值1、2、3来访问csv中的列1、2和3。我希望能够按名称而不是按索引号访问列,因为索引可以更改。
答案 0 :(得分:2)
以下代码为您提供了两种选择。一种是使用csv library(npm install csv
)的4.0.0版本,另一种是手工完成的。给定以下示例输入,两者都返回相同的结果:
const csv = require('csv')
const data = `One,Two,Three
1,2,3
4,5,6`
// Using the csv library:
csv.parse(
data,
{ columns: true },
(err, result) => console.log(result)
)
// Doing it manually:
const rowToObject = (headers, cells) =>
headers.reduce(
(acc, header, i) => {
acc[header] = cells[i]
return acc
},
{}
)
const csvToObjects = file => {
const [headerRow, ...dataRows] = file.split('\n')
const headers = headerRow.split(',')
return dataRows.map(
row => rowToObject(headers, row.split(','))
)
}
console.log(csvToObjects(data))
// both options output [{One:1,Two:2,Three:3},{One:4,Two:5,Three:6}]
您可以看到这两个都在此runkit中运行-抱歉,我目前无法在浏览器中运行StackOverflow代码段。
在这里,我将提到第三个选项:似乎您使用的是csv
软件包的旧版本。除了csv().from.path(path).to.array(options, callback)
,该模块还提供了to.object(options, callback)
method,但是我在查找旧版本的文档时遇到了麻烦(甚至不知道您使用的是哪个版本重新使用,这使事情变得更加困难。
答案 1 :(得分:0)
无法通过column_names访问列。读取csv时,将全部用逗号分隔。相反,您可以更改要通过列名读取的csv输出,例如-
csv_obj.from.path('../data_files/Signals_Info.csv).to.array(function (data) {
csv_data['signal_name'] = [];
csv_data['signal_type'] = [];
csv_data['initial_value'] = [];
for (var index = 1; index < data.length; index++) {
csv_data['signal_name'].push(data[index][0]);
csv_data['signal_type'].push(data[index][1]);
csv_data['initial_value'].push(data[index][2]);
...
}
console.log(csv_data);
});
答案 2 :(得分:0)
尝试使用Papaparse
并首先使阅读器具有这种功能-
function reader (csv) {
return new Promise((resolve, reject) => {
if (csv) {
parser(csv, {
...config, // . this could be as you want it to - read the docs
complete:(response) => resolve(response.data),
error:(error) => reject(error),
})
}
})
}
contents = reader(csv)
csv_obj = contents.map((row) => ({
signal_name: row[0],
signal_type: row[1],
initial_value: row[2],
minimum: row[3],
maximum: row[4],
}))