Как разобрать значение CSV двойных кавычек и присвоить объекту JSON? - PullRequest
0 голосов
/ 17 марта 2020

Привет, у меня есть строка CSV, как показано ниже, но когда я использую spilt(','), это создает проблему, так как мое значение CSV выглядит следующим образом:

FirstName,LastName,Company,Website,Designation,Linkedin,Email,Phone,City,State,Country,TechArea,FirmType,FirmSize,LastContactDate,NextContactDate,LeadDescription,OwnerNotes,ReminderDate,AdminNotes,LeadStatus
Andrew,O'Connor,Goulston & Storrs PC,https://www.goulstonstorrs.com,Associate,,aoconnor@goulstonstorrs.com,(617) 574-4153,Boston,,USA,,,,,,,,,,
Lawrence,Cogswell,"Hamilton, Brook, Smith & Reynolds, P.C",https://www.hbsr.com,Principal,,Lawrence.Cogswell@hbsr.com,(617) 607-5907,"Boston, MA",,,,,,,,,,,,

В Notepad ++ эти двойные кавычки появляются, а в Excel - все в одной ячейке.

Здесь "Hamilton, Brook, Smith & Reynolds, P.C" это одно значение пары ключей JSON, но моя функция синтаксического анализа обрабатывает его как отдельные значения, используя split(','). пожалуйста, помогите мне.

Ниже мой анализ CSV и выполнение JSON этой функции.

function convertToJson(inputCsv){

    //var csv is the CSV file with headers
  var userid = $('#upload-lead-button').val();
  console.log(userid);
  var lines=inputCsv.split("\r\n").slice(0, -1);
  var result = [];

  var headers=lines[0].split(",");

  for(var i=1;i<lines.length;i++){

      var obj = {};

    // Check if the line has inverted double quotes start and end
    // Example 
    // Lawrence,Cogswell,"Hamilton, Brook, Smith & Reynolds,P.C",https://www.hbsr.com,Principal,,Lawrence.Cogswell@hbsr.com,(617) 607-5907,"Boston, MA",,,,,,,,,,,,

      var currentline=lines[i].split(",");

    for(var j=0;j<headers.length;j++){

        var str = currentline[j]

        // var str1 = ''

        // str = str.trim()

        // if( str.startsWith('"') ){

        //   // str = str.replace(/^\"/, '');
        //   // str = str.replace(/\"$/, '');
        //   str1 = + str

        //   continue

        // }          

          obj[headers[j]] = str;


    }

    obj["userid"] = userid;
    result.push(obj);

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

}

1 Ответ

0 голосов
/ 17 марта 2020

Я решил вышеупомянутую проблему.

В этом я попытался пропустить разлитую для строки строки CSV, которая имеет ".

function convertToJson(inputCsv){

    //var csv is the CSV file with headers
  var userid = $('#upload-lead-button').val();
  console.log(userid);
  var lines=inputCsv.split("\r\n").slice(0, -1);
  var result = [];

  var headers=lines[0].split(",");

  for(var i=1;i<lines.length;i++){

      var obj = {};

    // Check if the line has inverted double quotes start and end
    // Example 
    // Lawrence,Cogswell,"Hamilton, Brook, Smith & Reynolds,P.C",https://www.hbsr.com,Principal,,Lawrence.Cogswell@hbsr.com,(617) 607-5907,"Boston, MA",,,,,,,,,,,,

    // IF DOUBLE QUOTES ARE NOT THERE THEN IN CURRENT LINE THEN SKIP  

    if(lines[i].includes('"')){

      var str1 = lines[i]

      var arr = CSVtoArray(str1)

      for(var j=0;j<headers.length;j++){

          var str = arr[j]   

          obj[headers[j]] = str;       

      }       

    }else{

      var currentline=lines[i].split(","); 

      for(var j=0;j<headers.length;j++){

          var str = currentline[j]   

          obj[headers[j]] = str;        

      }

    }

    obj["userid"] = userid;
    result.push(obj);

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

}


// Return array of string values, or NULL if CSV string not well formed.
function CSVtoArray(text) {
    var re_valid = /^\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*(?:,\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*)*$/;
    var re_value = /(?!\s*$)\s*(?:'([^'\\]*(?:\\[\S\s][^'\\]*)*)'|"([^"\\]*(?:\\[\S\s][^"\\]*)*)"|([^,'"\s\\]*(?:\s+[^,'"\s\\]+)*))\s*(?:,|$)/g;
    // Return NULL if input string is not well formed CSV string.
    if (!re_valid.test(text)) return null;
    var a = [];                     // Initialize array to receive values.
    text.replace(re_value, // "Walk" the string using replace with callback.
        function(m0, m1, m2, m3) {
            // Remove backslash from \' in single quoted values.
            if      (m1 !== undefined) a.push(m1.replace(/\\'/g, "'"));
            // Remove backslash from \" in double quoted values.
            else if (m2 !== undefined) a.push(m2.replace(/\\"/g, '"'));
            else if (m3 !== undefined) a.push(m3);
            return ''; // Return empty string.
        });
    // Handle special case of empty last value.
    if (/,\s*$/.test(text)) a.push('');
    return a;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...