Ошибка JavaScript возникает при конвертации CSV в Json Задать вопрос [закрыто]

Если вы пытаетесь рассчитать время начала из строки в формате HHMMSS, этот метод кажется мне намного проще:

select cast(stuff(stuff(right('0000000' + str, 6), 5, 0, ':'), 3, 0, ':') as time)
from (values ('120609'), ('0'), ('1001')) v(str)
-1
задан Stefan Becker 19 January 2019 в 07:00
поделиться

5 ответов

  
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))

0
ответ дан Kevin 19 January 2019 в 07:00
поделиться

Среди прочих проблем вы объединяете весь CSV-файл без разрывов строк. Ваша завершенная строка будет иметь «phoneJohn» в качестве одной строки и «21234123Millie» в качестве другой, потому что нет символов, разделяющих их. Похоже, что код, который вы написали, ожидает запятую между ними, но простое объединение двух строк "like"+"this" в javascript приведет к строке "likethis ", и вы не сможете снова разделить их. [112 ]

0
ответ дан Niles 19 January 2019 в 07:00
поделиться

Разделить CSV в строке через \n и 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))

0
ответ дан Sayed Tauseef Haider Naqvi 19 January 2019 в 07:00
поделиться

Во-первых, ваши тестовые данные не имеют разделителя строк - строка запускается. Вот код, который я только что скомбинировал, чтобы сделать то, что вы пытаетесь сделать (с такими опциями, как пользовательские разделители). Дайте мне знать, если у вас есть какие-либо вопросы:

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);

0
ответ дан Jeremy Harris 19 January 2019 в 07:00
поделиться

Поскольку в конечном итоге предполагается использовать в качестве входных данных настоящие csv-файлы, вам нужно убедиться, что все ваши значения разделены запятыми. Я уверен, что именно так работают файлы CSV .... может быть неправильно. В конце каждой строки у вас нет запятой. Я исправил это в моем фрагменте ниже.

Я также исправил использование 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))

0
ответ дан Guy 19 January 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: