2017-01-19 2 views
0

Использование C++, я хотел бы разбить строки строки (CSV-файл в этом случае), где некоторые из полей могут содержать разделители, которые экранированы (используя «"), и должны можно рассматривать как литералы. Я рассмотрел различные вопросы, уже поставленные, не нашел прямого ответа на мою проблему.C++ Разделение строк, но исключение всех разделителей в цитатах

Пример данных файла CSV:

Header1,Header2,Header3,Header4,Header5 
Hello,",,,","world","!,,!,","," 

Желаемая вектор строка после расщепления:

["Hello"],[",,,"],["world"],["!,,!,"],[","] 

Примечание: CSV является действительным, только если число столбцов данных равно количеству заголовков столбцов.

Предпочитаете невосстанавливаемое/стороннее решение. Эффективность не является приоритетом.

EDIT: Код ниже реализации регулярного выражения от @ClasG по меньшей мере удовлетворяет приведенному выше сценарию. Я разработка тестовых случаев бахромы, но хотелось бы услышать, когда/где ломается ...

std::string s = "Hello,\",,,\",\"world\",\"!,,!,\",\",\"\"";  
std::string rx_string = "(\"[^\"]*\"|[^,]*)(?:,|$)"; 
regex e(rx_string); 
std::regex_iterator<std::string::iterator> rit (s.begin(), s.end(), e); 
std::regex_iterator<std::string::iterator> rend; 

while (rit!=rend) 
{ 
    std::cout << rit->str() << std::endl; 
    ++rit; 
}  
+0

Возможный дубликат: http://stackoverflow.com/questions/1120140/how-can-i-read-and-parse-csv-files-in-c – roalz

+0

Нет стандартной библиотеки csv. Почему вы так сильно избегаете решения сторонних разработчиков? – BoBTFish

+1

@BoBTFish С радостью рассмотрит сторонние ответы. Просто заявляю, что будет идеально для этого случая использования. – Willeman

ответ

1

Это не решение полным (с ++), но регулярное выражение, которое может подтолкнуть вас в правильном направлении.

Регулярное выражение, как

("[^"]*"|[^,]*)(?:,|$) 

будут соответствовать отдельные столбцы. (Обратите внимание, что он не обрабатывает скрытые кавычки.)

See it here at regex101.

+0

Хмм, я этого не сделаю, но вы проверили свое регулярное выражение на всех возможных случаях csv-угла, в основном: разделители, новые строки или символы символов в полях? –

+0

Я не уверен, что регулярное выражение поддерживаемых языков соответствует C++ вообще, кроме +1 для прохладной ссылки ресурса. – Willeman

+0

@SergeBallesta Как уже упоминалось - «Не полное решение». Однако он справляется с приведенным примером, и я предполагаю, что это представитель возможных случаев. – ClasG

1

Это не ответ, но это слишком длинный вопрос, как комментарий ИМХО.

CSV - один из таких, казалось бы, простых, но на самом деле довольно дьявольских форматов хранения.

Дроид, которого вы ищете, является Boost.Spirit.

Имя Духовного Учителя (при переполнении стека) - это @sehe.

См свой ответ здесь: https://stackoverflow.com/a/18366335/2015579

Пожалуйста кредитной sehe, а не меня.

+0

Для его реализации потребуется больше опыта. Но спасибо. – Willeman

+0

@Willeman boost.sprit создает для вас машину состояний парсера. Это сложно, черт возьми, пока ты не повесишь его. –

Смежные вопросы