如何将字符串解析为无类型

时间:2018-09-10 15:14:37

标签: javascript angular typescript csv

我正在解析一个csv文件:

    let lines = csvData.split(/\r\n|\n/);
    let headers = lines[0].split(',');
    for (let i = 1; i < lines.length; i++) {
      let values = lines[i].split(',');
      let item = {};
      for (let j = 0; j < headers.length; j++) {
        item[headers[j]] = values[j];
      }
      items.push(item);
    }
    return items;

我正在获取其数据。但是,数据都是字符串。我想将它们传递给JSON,并使它们没有类型,因此我可以将它们传递给具有不同类型的变量。我不想直接使用parseInt / parseFloat,因为我不知道每个变量的具体类型。

但是,每次我将值传递给JSON时,它们都是字符串,例如。 “ 1234”,而不是1234。通常,我可以将JSON数据传递给没有类型的类,但是这次我将csvData转换为JSON,JSON数据都是字符串。我想这是因为split函数使它成为字符串?

可选: 我可以将类型传递给此函数,例如readCsvFile<T>(csvData),可以执行以下操作:

    if (typeof(T[headers[j]]) == 'number') {
      item[headers[j]] = parseFloat(values[j]);
    } else {
      item[headers[j]] = values[j];
    }

但是T [header [j]]未通过编译。

3 个答案:

答案 0 :(得分:1)

我会做些更实用的事情。

//Define variables
var csvData = "field1a,field2a,field3a\r\nfield1b,field2b,field3b";
var linesAsObjects = [];
var lines = csvData.split(/\r\n|\n/);

//Split fields here
var splitFields = function(line){
  let fields = line.split(',');
  addItem(fields);
}

// Assign field values to object or formatting here
var addItem = function(fields){
  let obj = {};
  obj.field1 = fields[0];
  obj.field2 = fields[1];
  obj.field3 = fields[2];

  linesAsObjects.push(obj);
}

// Call the code for each line
lines.forEach(splitFields);

//Printing lines and fields as assigned to an object.
console.log(linesAsObjects);

答案 1 :(得分:1)

如果您不需要知道类型(实际上您并不试图获取具有未知类型的属性的值),则可以使用“未知”类型https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html

这比“ any”要好得多,您可以在需要获取数据的位置键入数据。

答案 2 :(得分:0)

尝试对属性使用type any。

// add the fields you have from the CSV
class ResultFromCSV {
  myValue: any;
  otherValue: any;
}

...
let lines = csvData.split(/\r\n|\n/);
    let headers = lines[0].split(',');
    for (let i = 1; i < lines.length; i++) {
      let values = lines[i].split(',');

      // instantiate here
      let item = new ResultFromCSV();
      for (let j = 0; j < headers.length; j++) {
        item[headers[j]] = values[j];
      }
      items.push(item);
    }
    return items;