NGL@1.0.0-beta.7 Home Manual Reference Source Gallery

src/parser/csv-parser.js

  1. /**
  2. * @file Csv Parser
  3. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  4. * @private
  5. */
  6.  
  7. import { defaults } from '../utils.js'
  8. import { ParserRegistry } from '../globals.js'
  9. import Parser from './parser.js'
  10.  
  11. /**
  12. * CSV parser
  13. */
  14. class CsvParser extends Parser {
  15. /**
  16. * [constructor description]
  17. * @param {Streamer} streamer - the streamer object
  18. * @param {Object} params - parameter object
  19. * @param {Char} params.delimiter - delimiter character
  20. * @param {Char} params.comment - comment character
  21. * @param {Boolean} params.columnNames - use first data line as column names
  22. */
  23. constructor (streamer, params) {
  24. const p = params || {}
  25.  
  26. super(streamer, p)
  27.  
  28. this.delimiter = defaults(p.delimiter, ',')
  29. this.comment = defaults(p.comment, '#')
  30. this.columnNames = defaults(p.columnNames, false)
  31.  
  32. this.table = {
  33. name: this.name,
  34. path: this.path,
  35. columnNames: [],
  36. data: []
  37. }
  38. }
  39.  
  40. get type () { return 'csv' }
  41. get __objName () { return 'table' }
  42.  
  43. _parse () {
  44. const data = this.table.data
  45. const reDelimiter = new RegExp('\\s*' + this.delimiter + '\\s*')
  46.  
  47. let j = 0
  48.  
  49. this.streamer.eachChunkOfLines(chunk => {
  50. const n = chunk.length
  51.  
  52. for (let i = 0; i < n; ++i) {
  53. var line = chunk[ i ].trim()
  54. if (line.startsWith(this.comment)) continue
  55. const values = line.split(reDelimiter)
  56.  
  57. if (j === 0) {
  58. this.table.columnNames = values
  59. } else if (line) {
  60. data.push(values)
  61. }
  62. ++j
  63. }
  64. })
  65. }
  66. }
  67.  
  68. ParserRegistry.add('csv', CsvParser)
  69.  
  70. export default CsvParser