std :: getline для файла таблицы с разделителями-запятыми с кавычками вокруг определенных полей - PullRequest
5 голосов
/ 22 апреля 2011

Я в основном запускаю следующий код.Этот код перебирает строку за строкой и захватывает различные поля общего файла таблицы с разделителями-запятыми.Моя проблема в том, что иногда поле «title» может содержать запятые.Когда это произойдет, он будет заключен в кавычки, например: «это, это мой заголовок».Но когда мой код видит запятую, он обрабатывает все после него, как следующее поле.Не все названия имеют кавычки, только те, в которых есть запятые.Моя проблема в том, что я понятия не имею, как сделать проверку кода для этого .... Как я могу получить свой код для проверки на эту проблему?

Большое спасибо, yall.Это очень много значит для моей оплачиваемой работы!

while (getline(BookLine, ImpLine, '\n'))  // Get each line
{
   // create a string stream from the standard string
   std::istringstream StrLine(ImpLine);

   std::string
   bookNumber,
   chk,
   author,
   title,
   edition;

   // Parse lines
   std::getline(StrLine,bookNumber,',');
   std::getline(StrLine,chk,',');
   std::getline(StrLine,author,',');
   std::getline(StrLine,title,',');            
   std::getline(StrLine,edition,',');
}

Ответы [ 2 ]

6 голосов
/ 22 апреля 2011

Делать это хорошо довольно сложно.По сути, вы читаете первый символ.Если это не цитата, тогда вы читаете до следующей запятой.Если это цитата, вы читаете следующую цитату.Затем вы смотрите на символ next и смотрите, не является ли это другой цитатой.Если это так, вы читаете к следующей цитате снова и добавляете то, что вы прочитали, в конец того, что вы прочитали в первый раз, но без одной из кавычек (т.е.представлены двумя последовательными кавычками).Когда вы получаете кавычку, за которой следует что-то кроме кавычки (обычно это запятая), вы достигли конца этого поля.

2 голосов
/ 22 апреля 2011

Не проверял, но примерно вы хотите ...

std::vector<string> values;
std::string value;
bool in_quoted = false;

for (const char* p = ImpLine.c_str(); *p; ++p)
    if (*p == ',' && !in_quoted)
    {
        values.push_back(value);
        value.clear();
    }
    else if (*p == '"')
        if (in_quoted)
            if (p[1] == '"')
                value += *++p;
            else
                in_quoted = false;
        else
            in_quoted = true;
    else
        value += *p;

values.push_back(value);

(Вы можете настроить его, чтобы обрезать поля окружающих пробелов.)

...