从CSV文件转换为按列名选择的特定列的数组

时间:2018-11-20 16:18:09

标签: javascript node.js typescript

我是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。我希望能够按名称而不是按索引号访问列,因为索引可以更改。

3 个答案:

答案 0 :(得分:2)

以下代码为您提供了两种选择。一种是使用csv librarynpm 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],

        }))