Разделение строки с несколькими разделителями, что позволяет использовать кавычки

документы за boost::escaped_list_separator предоставить следующее объяснение второго параметра c:

любой символ в строке c, считается разделителем.

Итак, мне нужно разделить строку с несколькими разделителями, разрешив значения в кавычках, которые могут содержать эти разделители внутри:

#include <iostream>
#include <string>

#include <boost/tokenizer.hpp>

int main() {
std::wstring str = L"2   , 14   33  50   \"AAA BBB\"";

std::wstring escSep(L"\\"); //escape character
std::wstring delim(L" \t\r\n,"); //split on spaces, tabs, new lines, commas
std::wstring quotes(L"\""); //allow double-quoted values with delimiters within

boost::escaped_list_separator<wchar_t> separator(escSep, delim, quotes);
boost::tokenizer<boost::escaped_list_separator<wchar_t>, std::wstring::const_iterator, std::wstring> tok(str, separator);

for(auto beg=tok.begin(); beg!=tok.end();++beg)
std::wcout << *beg << std::endl;

return 0;
}

Ожидаемый результат будет [2; 14; 33; 50; AAA BBB]. Тем не менее, его код Результаты в куче пустых токенов:

введите описание изображения здесь

регулярное boost::char_separator пропускает все эти пустые токены, учитывая все разделители. Кажется, что boost::escaped_list_separator также учитывает все указанные разделители, но выдает пустые значения. Правда ли, что если встретятся несколько последовательных разделителей, то будут выданы пустые токены? Есть ли способ избежать этого?

Если всегда верно, что создаются только пустые токены, легко проверить полученные значения и опустить их вручную. Но это может стать довольно уродливым. Например, представьте строки, каждая из которых имеет 2 фактических значения и, возможно, со многими вкладками И пробелами, разделяющими значения. Затем указав разделители как L"\t " (то есть пробел и табуляция) будут работать, но выдают тонну пустых токенов.

0

Решение

Судя по документации Boost Tokenizer, вы действительно правы, полагая, что при обнаружении нескольких последовательных разделителей при использовании будут создаваться пустые токены. boost::escaped_list_separator, В отличие от boost::char_separator, boost::escaped_list_separator не предоставляет конструктора, который позволяет вам указывать, следует ли сохранять или отбрасывать любые созданные пустые токены.

Хотя возможность отбрасывать пустые токены может быть полезной, если учесть вариант использования (анализ файлов CSV), представленный в документации (http://www.boost.org/doc/libs/1_64_0/libs/tokenizer/escaped_list_separator.htm), хранение пустых токенов имеет смысл. Пустое поле — это все еще поле.

Один из вариантов — просто сбросить пустые токены после токенизации. Если вас беспокоит создание пустых токенов, альтернативой является удаление повторяющихся разделителей перед передачей их токенизатору, но, очевидно, вам нужно будет позаботиться о том, чтобы ничего не удалять внутри кавычек.

2

Другие решения

Других решений пока нет …