Tehsurfer/plotvuer

View on GitHub
src/components/csv_manager.js

Summary

Maintainability
A
55 mins
Test Coverage
var Papa = require('papaparse')

class Sparccsv {

  constructor(){
  }

  loadFile(file_url) {
    return new Promise( (resolve) => {
      fetch(file_url).then(response => response.text())
        .then( data => {
          this.csv_data = Papa.parse(data)
          resolve() 
        })
      })
  }

  loadData(data) {
    return new Promise( (resolve) => {
      this.csv_data = {}
      this.csv_data.data = data
      resolve() 
    })
  }

  transposeSelf() {
    var tempData = this.transpose(this.csv_data.data)
    this.csv_data.data = tempData
  }

  getDataType() {
    var first = this.getHeaders()[0]
    if (first.toLowerCase().includes('time')) {
      return 'scatter'
    } else if (first.toLowerCase().includes('name')) {
      return 'bar'
    }    
    var first_col = this.getColoumnByIndex(0)
    if (Number(first_col[4]) > Number(first_col[3])){
      return 'scatter'
    } else {
      return 'bar'
    }
  }

  getXaxis(){
    var firstHeader = this.csv_data.data[0][0]
    return firstHeader.split('-').join(' ').split('_').join(' ')
  }

  getTitle(url){
    var title = url.split('/').pop() //grab file from url
    title = title.split('-').join(' ').split('_').join(' ').split('.')[0] //Process file name into title
    return title
  }

  // Return all headers
  getHeaders() {
    return this.csv_data.data[0]
  }

  // Returns all headers except for first cell
  getHeadersExceptForFirst(){
    var headers = this.csv_data.data[0] 
    headers.shift()
    return headers
  }

  getCSVData() {
    return [...this.csv_data.data]
  }

  // Remove header and first row to pass data values only
  getDataValuesOnly(){
    let all_data = [...this.csv_data.data]
    let headers_removed = all_data.slice(1)
    let headers_and_col_removed = headers_removed.map(function(row) {
      return row.slice(1);
    });
    return headers_and_col_removed
  }

  getSampleRate() {
    return 1 / (this.csv_data.data[1][1] - this.csv_data.data[1][0])
  }

  getColoumnByIndex(index) {
     let col = this.csv_data.data.map((row) => { return row[index] })
     col.shift()
     return col
  }

  getHeaderByIndex(index) {
    return this.csv_data.data[0][index]
  }

  getColoumnByName(column_name) {
    var column_index = 0
    for (let i in this.csv_data.data[0]) {
      if (this.csv_data.data[0][i] === column_name) {
        column_index = i
      }
    }
    if (column_index === 0){
      return false // if coloumn not found
    }
    return this.getColoumnByIndex(column_index)
  }

  getByAxes(channelx, channely){
    var dx = []
    var c1 = this.getColoumnByIndex(0)
    var index = []
    for (let i in channely){
      for (let j in c1){
        if (c1[j] === channely[i]){
          index.push(j)
          continue
        }
      }
    }
    var datat = []
    for (let i in channelx){
      var col = []
      dx = this.getColoumnByName(channelx[i])
      for(let j in index){
        col.push(dx[index[j]])
      }
      datat.push(col)
    }
    return [...this.transpose(datat)]
  }

  export(selectedChannels){
    var headerList = []
    var selectedData = []
    headerList.push(this.getHeaderByIndex(0))
    selectedData.push(this.getColoumnByIndex(0))
    for (let i in selectedChannels){
      headerList.push(selectedChannels[i])
      selectedData.push(this.getColoumnByName(selectedChannels[i]))
    }
    var filename = 'sparc-export-' + Math.random().toString(36).slice(-5)  + '.csv'
    this.downloadCSV({
      filename: filename,
      data: this.transpose(selectedData),
      columns: headerList
    })
  }

  transpose(array){
    return array[0].map((col, i) => array.map(row => row[i]));
  }

  downloadCSV = (args) => {  

    /* Use like so: 
     downloadCSV({ 
      filename: 'filename.csv',
      data: [{'a': '1', 'b': '2'}],
      columns: ['a','b']
      });
     */

    let filename = args.filename || 'export.csv';

    let csv = Papa.unparse(args.data)
    if (csv == null) return;

    var blob = new Blob([csv]);
    var a = window.document.createElement("a");
    a.href = window.URL.createObjectURL(blob, {type: "text/plain"});
    a.download = filename;
    document.body.appendChild(a);
    a.click();  // IE: "Access is denied"; see: https://connect.microsoft.com/IE/feedback/details/797361/ie-10-treats-blob-url-as-cross-origin-and-denies-access
    document.body.removeChild(a);
  }
}

module.exports = Sparccsv