Разобрать строку через запятую используя JavaScript? - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно проанализировать CSV-файл с помощью JavaScript.Разбирать разделенную запятыми строку может быть легко, если значения не содержат запятых сами по себе, просто используя str.split (',').Но как это сделать, если строка следующая:

12.0, trs, "xx-xx NY, US"

или иногда на всех значениях есть кавычки или двойные кавычки:

"12.0", "trs", "xx-xx NY, US"

, но иногда после запятой также есть дополнительные пробелы:

"12.0", "trs"," xx-xx NY, US "

Полагаю, мне нужно использовать регулярное выражение, но я не смог найти универсальное выражение, охватывающее все случаи.Пожалуйста, помогите!

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Поскольку в других ответах в основном используется регулярное выражение, здесь у вас есть наивная реализация, как вы можете разобрать его, перебирая символы в каждой строке.Это явно не так эффективно, как другие ответы, просто возможный способ справиться с вашим вводом

const settings = {
  separator: ',',
  wrap: '"',
  ignore: ' '
};

const csv = [
  '12.0,trs,"xx-xx NY,US"',
  '"12.0","trs","xx-xx NY,US"',
  '"12.0","trs", "xx-xx NY,US"',
  '"12.0","trs", "xx-xx ""NY"",US"'
];

function parseLine( line ) {
  let 
    insideWrap = false, 
    isFirst = true;
  return line.split('').reduce( (columns, char) => {
    if (insideWrap) {
      if (char === settings.wrap) {
        insideWrap = false;
        return columns;
      }
    } else {
      if (char === settings.wrap) {
        insideWrap = true;
        if (isFirst) {
          isFirst = true;
          return columns;
        }
      }
      if (char === settings.separator) {
        isFirst = true;
        return columns;
      }
      if (isFirst && char === settings.ignore) {
        return columns;
      }
    }
    if (isFirst) {
      isFirst = false;
      columns.push('');
    }
    const idx = columns.length - 1;
    columns[idx] += char;
    return columns;
  }, []);
}

function getCsvData( lines ) {
  return lines.map( parseLine );
}

console.log( getCsvData( csv ) );
0 голосов
/ 10 декабря 2018

Вы можете добавить регулярное выражение в split.

var date = "02-25-2010";
var myregexp2 = new RegExp("/(?:[^",]+|"[^"]*")+/g"); 
dateArray = date.split(myregexp2);
0 голосов
/ 10 декабря 2018

Синтаксический анализ CSV с помощью регулярных выражений не является хорошей идеей, если вы заранее не знаете, что CSV будет соответствовать очень конкретным пределам, которые вы можете предсказать.На практике это случается редко, поэтому люди сталкиваются с проблемой создания парсеров CSV. Смотрите здесь для длительного обсуждения.

Есть несколько парсеров, и они просты в использовании.Например, с Papa Parse вы можете просто позвонить parse на строку и перестать беспокоиться о крайних случаях:

console.log(Papa.parse('12.0,trs,"xx-xx NY,US"').data[0])
console.log(Papa.parse('"12.0","trs","xx-xx NY,US"').data[0])
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/4.6.2/papaparse.js"></script>
0 голосов
/ 10 декабря 2018

Используйте match вместо split и многократно сопоставляйте не запятые, не " символы или " s, а затем не " символы (таким образом, запятые внутри " s, по желанию), за которым следует еще ".Также используйте отрицательный прогноз для пробела в начале шаблона, чтобы убедиться, что первый совпавший символ не является пробелом:

const translate = str => console.log(
  str.match(/(?! )(?:[^",]+|"[^"]*")+/g)
);

[
  `12.0,trs,"xx-xx NY,US"`,
  `"12.0","trs","xx-xx NY,US"`,
  `"12.0","trs", "xx-xx NY,US"`
].forEach(translate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...