根据列读取CSV文件

时间:2017-04-10 09:30:06

标签: javascript angularjs

我正在Angular js项目中工作,我必须使用javascript读取CSV文件列。我检索了CSV并将其打印在控制台中。我能够明智地拆分csv行。如何根据列进行操作?

提前致谢。

2 个答案:

答案 0 :(得分:0)

CSV只不过是一个2 dim数组。通过使用2 for循环,你可以做到。

例如:

  for(var i=0;i<col.length;i++){
   for(var j=0;j<rows.length;j++){
      arr[i][j]
   }
 }

答案 1 :(得分:0)

有趣的是,解析CSV文件听起来很容易,但是会很快变得复杂(取决于CSV的来源:用户生成的,API格式的固定格式,...)

  • 解析标头
  • 标题和数据列的数量不同
  • 定界符(德语经常使用;而不是,
  • 数字格式(德语经常使用,代替.作为小数分隔符)
  • 报价数据(可能在报价数据中带有定界符)
  • 空白
  • 行尾
  • ...

这就是为什么npm(https://www.npmjs.com/search?q=csv)上有很多CSV解析器的原因。一些专注于解析速度(例如https://www.npmjs.com/package/fast-csv),一些专注于便利性(例如https://www.npmjs.com/package/papaparse)。

但据我所知,所有人都有一个共同点,那就是按行返回。通常会导致它能够处理将按行而不是按列传递数据的流。

下面是一个代码示例,可让您的数据列更明智:

const input = `header_1,header_2
value 1,value 2
value 3,value 4`

// get rows -> here \n as line ending is known
const rows = input.split('\n');

// get the first row as header
const header = rows.shift();

// get number of columns by splitting the header
// , as delimiter is known here. Could be different ...
const numberOfColumns = header.split(',').length

// initialize 2D-array with a fixed size
const columnData = [...Array(numberOfColumns)].map(item => new Array());

for(var i=0; i<rows.length; i++) {
  var row = rows[i];
  var rowData = row.split(',');

  // assuming that there's always the same
  // number of columns in data rows as in header row
  for(var j=0; j<numberOfColumns; j++) {
    columnData[j].push(rowData[j]);
  }
}

console.log("columnData = " + JSON.stringify(columnData, null, 4));

输出将是:

columnData = [
    [
        "value 1",
        "value 3"
    ],
    [
        "value 2",
        "value 4"
    ]
]

不包括剥离空格,转换数字,...

为方便起见,您可以使用papaparse明智地获取数据行,然后再次使用嵌套的for循环:

const Papa = require('papaparse');

// example data with delimiter ; and empty lines
const input = `header_1;header_2
1;"2"

3;4`;

// options for papaparse
const parseOptions = {
    quoteChar: '"', // quoting character
    delimiter: ';',
    skipEmptyLines: true, // ignore empty lines
    dynamicTyping: true,  // parse numbers automatically
}

const parseResult = Papa.parse(input, parseOptions);
const parsedData = parseResult.data;

// get the first row as header
const header = parsedData.shift();

const numberOfColumns = header.length;

// initialize 2D-array with a fixed size
const columnData = [...Array(numberOfColumns)].map(item => new Array());

for(var i=0; i<parsedData.length; i++) {
  var rowData = parsedData[i];

  for(var j=0; j<numberOfColumns; j++) {
    columnData[j].push(rowData[j]);
  }
}

console.log("columnData = " + JSON.stringify(columnData, null, 4));

输出将是:

columnData = [
    [
        1,
        3
    ],
    [
        2,
        4
    ]
]