Задать вопрос
@newaitix

Как разбить строку по знаку?

Есть строка. Это кусок из csv файла.
"a,b",a b,,,,,,,,,,,,,,,,,,,,
Я разбиваю данные из csv по строкам используя split("\r\n") а затем разбиваю по клеткам используя split(",")
Но если в клетке прописать запятую например a,b то разбиение произойдет не верно.
Если в клетке нет запятой то данные из клетки будут выглядеть так
a b
Если в клетке есть запятая то данные из клетки будут выглядеть так
"a,b"
Не могу придумать как разбить эту троку так чтоб запятая такм где "a,b" игнорировалась.
Есть ли способ как то праильно разбить эти данные?
  • Вопрос задан
  • 93 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function CSVToArray(strData, strDelimiter = ','){
  const objPattern = new RegExp(
    "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
    "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
    "([^\"\\" + strDelimiter + "\\r\\n]*))",
    'gi'
  );
  const arrData = [[]];
  let arrMatches = null;
  while (arrMatches = objPattern.exec(strData)){
    const strMatchedDelimiter = arrMatches[ 1 ];
    if (
      strMatchedDelimiter.length &&
      strMatchedDelimiter !== strDelimiter
    ) {
      arrData.push([]);
    }
    const strMatchedValue = arrMatches[2]
      ? arrMatches[2].replace(new RegExp("\"\"", 'g' ), "\"")
      : arrMatches[3];
    arrData[arrData.length - 1].push(strMatchedValue);
  }
  return( arrData );
}

console.log(CSVToArray('"a,b",a b,')); // Array(3) [ "a,b", "a b", "" ]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Smirator
Привет.
Воспользоваться регулярными выражениями.
Если правильно понял твою задачу, то в твоем случае должно быть: /,(?!\s*")/

const string = "a,b",a b,,,,,,,,,,,,,,,,,,,
const cells = string.split(/,(?!\s*")/);
console.log(cells);
////
[
  "a,b",
  "a b",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  ""
]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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