Разбить строку, игнорируя разделы в кавычках - PullRequest
20 голосов
/ 08 августа 2008

С учетом такой строки:

a, «строка, с», различные, «значения и некоторые», в кавычках

Что является хорошим алгоритмом для разделения этого значения на запятые, игнорируя запятые внутри разделов в кавычках?

Выходные данные должны быть массивом:

["a", "строка, с", "различными", "значениями и некоторыми", "в кавычках"]

Ответы [ 13 ]

0 голосов
/ 08 августа 2008

Это стандартный анализ в CSV-стиле. Многие люди пытаются сделать это с помощью регулярных выражений. Вы можете получить около 90% с помощью регулярных выражений, но вам действительно нужен настоящий анализатор CSV, чтобы сделать это правильно. Несколько месяцев назад я нашел быстрый, превосходный C # CSV-парсер на CodeProject *, который я настоятельно рекомендую!

0 голосов
/ 08 августа 2008

Вот простой алгоритм:

  1. Определите, начинается ли строка с символа '"'
  2. Разбить строку на массив, ограниченный символом '"'.
  3. Отметьте запятые в кавычках с помощью заполнителя #COMMA#
    • Если ввод начинается с '"', отметьте те элементы в массиве, где индекс% 2 == 0
    • В противном случае пометьте те элементы в массиве, где индекс% 2 == 1
  4. Объединить элементы в массиве, чтобы сформировать измененную строку ввода.
  5. Разбить строку на массив, разделенный символом ','.
  6. Заменить все экземпляры в массиве #COMMA# заполнителей на символ ','.
  7. Массив - это ваш вывод.

Вот реализация Python:
(фиксируется для обработки '' a, b ", c," d, e, f, h "," i, j, k "')

def parse_input(input):

    quote_mod = int(not input.startswith('"'))

    input = input.split('"')
    for item in input:
        if item == '':
            input.remove(item)
    for i in range(len(input)):
        if i % 2 == quoted_mod:
            input[i] = input[i].replace(",", "#COMMA#")

    input = "".join(input).split(",")
    for item in input:
        if item == '':
            input.remove(item)
    for i in range(len(input)):
        input[i] = input[i].replace("#COMMA#", ",")
    return input

# parse_input('a,"string, with",various,"values, and some",quoted')
#  -> ['a,string', ' with,various,values', ' and some,quoted']
# parse_input('"a,b",c,"d,e,f,h","i,j,k"')
#  -> ['a,b', 'c', 'd,e,f,h', 'i,j,k']
0 голосов
/ 08 августа 2008

Я использую это для анализа строк, не уверен, поможет ли это здесь; но с некоторыми незначительными изменениями, возможно?

function getstringbetween($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);   
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

$fullstring = "this is my [tag]dog[/tag]";
$parsed = getstringbetween($fullstring, "[tag]", "[/tag]");

echo $parsed; // (result = dog) 

/ * тр * 1004

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...