CSV-файл не помещает значения в двойных кавычках в одну и ту же ячейку при создании с помощью JavaScript

#javascript #csv #export-to-csv

Вопрос:

Я работаю со строкой CSV, которая содержит двойные кавычки («) вокруг имени и фамилии человека с целью указания полного имени в одной ячейке. Значение в двойных кавычках также содержит запятую, поскольку имя находится в порядке «фамилия, имя». Пример: "Smith, Matt" .

Я создаю CSV-файл из этой строки, используя следующий JavaScript:

 //shortened example of the CSV string
let csv = [
  ["Smith, Matt", 'Developer'],
];

var blob = new Blob([csv], { type: 'text/csv' });
if (navigator.msSaveBlob) { // IE 10 
  navigator.msSaveBlob(blob, filename);
} else {
  let link = document.createElement("a");
  if (link.download !== undefined) { // feature detection
    // Browsers that support HTML5 download attribute
    var url = URL.createObjectURL(blob);
    link.setAttribute("href", url);
    link.setAttribute("download", "test.csv");
    link.setAttribute("target", '_self');
    link.style.visibility = 'hidden';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  }
}
 

CSV-файл, созданный на основе этого, не использует двойные кавычки с запятой. Двойная кавычка отображается как символ сущности в файле CSV, а запятая обеспечивает разделение значений на отдельные ячейки:

Имя Роль
amp;quot;Matt Smithamp;quot; Разработчик

У меня нет возможности изменить порядок «фамилия, имя» в строке, поэтому в значении имени потребуется запятая. Есть ли способ загрузить файл CSV и заставить двойные кавычки применять правило, согласно которому, даже если они содержат запятую в значении, полное значение в кавычках должно находиться в той же ячейке?

Комментарии:

1. Вы пробовали экранировать символы?

2. @darklightcode Я не пробовал экранировать. Есть ли сообщение, которое вы бы порекомендовали для этого?

3. взгляните на csv-parser и papaparse

Ответ №1:

Самый простой подход — изменить разделитель на тот, который не используется в ваших объектах. Например, вы можете использовать знак запятой.

 let rawCsv = [
  ["Smith, Matt", 'Developer'],
];
let csv = rawCsv.map(x=>{
  return x.join(';');
})

// saving file