将Csv转换为Json提问

时间:2019-01-19 06:03:42

标签: javascript json firebase csv web-applications

我正在尝试使用Java脚本将逗号分隔的值文件(CSV)转换为“ json”:

var csv = "FirstName,LastName,dob,phone"+
"John,Smith,10/01/1998,21234123"+
"Millie,Henderson,23/03/2000,21768345"+
"Briana,Wright,23/03/1976,22321467";

function csvJSON(csv){
var values=csv.split(',');
var index =-1;
var lines = [];
  for(var i=0;i<values.length; i++){
    lines[index] = lines[index]+ values[i]+ ",";
    if (i % 3==0){
      index++;
    }
  }

  var result = [];
  var headers=lines[0].split(',');
  lines.splice(0, 1);
  lines.forEach(function(line) {
    var obj = {};
    var currentline = line.split(',');
    headers.forEach(function(header, i) {
      obj[header] = currentline[i];
    });
    result.push(obj);
  });

  return result; //JavaScript object
  //return JSON.stringify(result); //JSON
}

console.log(csvJSON(csv))

不幸的是,我遇到了以下错误。在我精疲力尽之前,有人可以在这里帮助我吗!谢谢!! (最后,我实际上是通过Web应用程序将csv文件导入到RealTime Fire-base数据库中的。VARCSV仅用于测试目的。(而且我将无法使用npm库。。)

5 个答案:

答案 0 :(得分:0)

在其他问题中,您正在串联整个csv文件且没有换行符。完成的字符串将以“ phoneJohn”作为一个字符串,并以“ 21234123Millie”作为另一个字符串,因为没有字符将它们分开。似乎您编写的代码期望它们之间使用逗号,但是在JavaScript中将"like"+"this"的两个字符串简单地串联在一起将得到字符串"likethis”,并且您将无法将它们分开再次。

答案 1 :(得分:0)

通过\n将csv拆分为行,并通过,分隔col。使用代码将任何csv转换为json。对象键将是csv标头。

var csv = `FirstName,LastName,dob,phone
John,Smith,10/01/1998,21234123
Millie,Henderson,23/03/2000,21768345
Briana,Wright,23/03/1976,22321467`;

    function csvJSON(csv) {
        //split csv data with \n get all rows of csv
        var rows = csv.split('\n');
        //index of 0 is header then split header string with ,
        var headers = rows[0].split(',');
        //remove headers index 0 from rows
        rows = rows.splice(1);
        var result = [];

        rows.forEach(function (row) {
            var obj = {};
            //split data row with ,
            var values = row.split(',');
            headers.forEach(function (key, index) {
                obj[key] = values[index];
            });
            result.push(obj);
        })
        return result;
    }

    console.log(csvJSON(csv))

答案 2 :(得分:0)

  
var csv = "FirstName,LastName,dob,phone"+
"John,Smith,10/01/1998,21234123"+
"Millie,Henderson,23/03/2000,21768345"+
"Briana,Wright,23/03/1976,22321467";
function csvJSON(csv){
var values=csv.split(',');
var index =-1;
var lines = [];
  for(var i=0;i<values.length; i++){
    lines[index] = lines[index]+ values[i]+ ",";
    if (i % 4==0){
      index++;
    }
  }

  var result = [];
  var headers=lines[0].split(',');
  lines.splice(0, 1);
  lines.forEach(function(line) {
    var obj = {};
    var currentline = line.split(',');
    headers.forEach(function(header, i) {
      obj[header] = currentline[i];
    });
    result.push(obj);
  });

  return result; //JavaScript object
  //return JSON.stringify(result); //JSON
}


console.log(csv)
console.log(csvJSON(csv))

答案 3 :(得分:0)

由于最终打算将实际的csv文件用作输入,因此,您需要确保所有值都用逗号分隔。可以肯定的是,csv文件是这样工作的。...可能是错误的。 在每一行的末尾,您 not 都包含一个逗号。我已在下面的代码段中修复了该问题。

我还更正了使用4列的内容(您似乎有4个标题,但仅尝试使用3个?),将index ++行移动到了之前,检查了未定义的值在连接到这些行之前,并删除了空白标题。

var csv = "FirstName,LastName,dob,phone,"+
"John,Smith,10/01/1998,21234123,"+
"Millie,Henderson,23/03/2000,21768345,"+
"Briana,Wright,23/03/1976,22321467";

function csvJSON(csv){
  var values=csv.split(',');
  var index =-1;
  var lines = [];
  for(var i=0;i<values.length; i++){
    if (i % 4==0){
      index++;
    }
if (typeof lines[index] === 'undefined') lines[index] = "";
    lines[index] = lines[index]+ values[i]+ ",";
  }

  var result = [];
  var headers=lines[0].split(',').splice(0, lines.length);
  lines.splice(0, 1);
  lines.forEach(function(line) {
    var obj = {};
    var currentline = line.split(',');
    headers.forEach(function(header, i) {
      obj[header] = currentline[i];
    });
    result.push(obj);
  });

  return result; //JavaScript object
  //return JSON.stringify(result); //JSON
}

console.log(csvJSON(csv))

答案 4 :(得分:0)

首先,您的测试数据没有行定界符-字符串是连续的。这是一些我刚刚汇总在一起即可完成的工作的代码(带有自定义定界符之类的选项)。如果您有任何疑问,请告诉我:

var testData = "FirstName,LastName,dob,phone"+"\n"+
"John,Smith,10/01/1998,21234123"+"\n"+
"Millie,Henderson,23/03/2000,21768345"+"\n"+
"Briana,Wright,23/03/1976,22321467"+"\n";

function csvToJson(data, customOptions) {
  
  // Default options. Override with passed in parameters
  var options = {
    hasHeaderRow: true,
    fieldDelimiter: ",",
    rowDelimiter: "\n"
  };
  if (typeof customOptions === 'object' && customOptions !== null) {
    for (var option in customOptions) {
      if (options.hasOwnProperty(option)) {
        options[option] = customOptions[option];
      }
    }
  }
  
  // Break into rows
  var rows = data.split(options.rowDelimiter);
  if (rows instanceof Array !== true || rows.length == 0) {
    console.log("No rows found or invalid row delimiter.");
    return;
  }
  
  // Determine field count
  var fieldCount = parseInt(rows[0].split(options.fieldDelimiter).length);
  
  // Parse header
  if (options.hasHeaderRow == true) {
    var headerRow = rows.shift();
  } else {
    var headerRowPlaceholders = [];
    for (var i = 1; i < fieldCount + 1; i++) {
      headerRowPlaceholders.push('field'+i);
    }
    var headerRow = headerRowPlaceholders.join(options.fieldDelimiter);
  }
  headerRow = headerRow.split(options.fieldDelimiter);
  
  // Convert rows to objects
  for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
    var rowObject = {};
    var rowData = rows[rowIndex].split(options.fieldDelimiter);
    if (rowData.length === fieldCount) {
      for (var headerIndex = 0; headerIndex < headerRow.length; headerIndex++) {
        rowObject[headerRow[headerIndex]] = rowData[headerIndex];
      }
      rows[rowIndex] = rowObject;
    } else {
      rows.splice(rowIndex, 1);
    }
  }
  
  return rows;
}

var result = csvToJson(testData, {
  hasHeaderRow: true,
  fieldDelimiter: ",",
  rowDelimiter: "\n"
});

console.log(result);

相关问题