2016-02-09 3 views
4

Итак, я пытался прочитать файл csv с помощью C++ и выполнить некоторые вычисления и вывод в другой файл csv. Все работает нормально, но когда программа считывает строку:C++ Чтение двойных кавычек из файла

<a href="http://www.google.com" target="_blank">google</a> 

, и я хочу увидеть, что программа чтения, так что я COUT эту строку, и это показывает:

<a href=""http://www.google.com"" target=""_blank"">google</a> 

В основном это удваивается каждый двойные кавычки? Как я могу это решить?

редактирует:

Вот мой код:

int main() 
{ 
    ifstream read; 
    ofstream write; 
    string line; 
    string cell; 
    int col = 0; 
    string temp; 
    string links; 
    read.open("Book1.csv"); 
    write.open("output.csv"); 
    if (read.is_open()) 
    { 
     cout << "opened" <<endl ; 
     getline(read, line); 
     while(getline(read,temp)) 
     { 
      stringstream line(temp); 
      while (getline(line, cell, ',')) 
      { 
       if (col > 9) 
       { 
        links.pop_back(); 
        write << links<<endl; 
        col = 0; 
        links = ""; 
        break; 
       } 
       else 
       { 
        if (cell != "") 
        { 
         if (col == 0) 
         { 
          write << cell<<','; 
         } 
         else if (col == 1) 
         { 
          write << cell<<','; 
         } 
          else 
        { 
          cell.erase(0, 1); 
          cell.pop_back(); 
          links += cell; 

          links += '/'; 
         } 
         cout << cell << endl; 
        } 
        col += 1; 
       } 
      } 
     }  
    } 
    else 
    { 
     cout << "failed" << endl; 
    }  
    read.close(); 
    write.close(); 
} 
+1

Как вы читаете этот файл. Это произойдет не случайно, используя стандартные вызовы библиотеки. См. Пример: http://ideone.com/j3jJrO. – Chad

+0

@ Я использовал getline и stringstream. О, кстати, как я могу сделать эти серо-фоновые комментарии? Я новичок в SO – andyz

+0

Невозможно дублировать: http://ideone.com/SX4272 – PaulMcKenzie

ответ

3

Это совершенно нормально. Кавычки внутри поля (внутри вашего файла csv) экранируются с помощью другой цитаты для генерации действительного csv.

Рассмотрим Csv данные:

123,"monitor 27"", Samsung",456 

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

Таким образом, это не чтение, которое добавляет дополнительные кавычки, они уже находятся внутри вашего csv (но просмотрщик csv будет показывать только одну цитату после разбора).

Если вы выводите эту строку на другой csv, вы можете (нужно) оставить двойные кавычки, просто убедитесь, что все поле также окружено кавычками.


Update (после размещения кода):

Во-первых, я буду считать, что вторая строка вы вывесили был также окружен кавычками, как это:

"<a href=""http://www.google.com"" target=""_blank"">google</a>" 

В противном случае вам будут иметь недопустимые данные csv.

Чтобы разобрать csv, мы не можем просто разделить на каждый ,, потому что внутри поля может быть один.

Допустим, у нас есть следующие поля:

123 
monitor 27", Samsung 
456 

Чтобы написать те, на правильную строку CSV, то второе поле должно быть окружено кавычками, потому что есть запятая внутри. Если в поле с кавычками есть кавычки, они должны быть экранированы другой цитатой. Таким образом, мы получаем следующее:

123,"monitor 27"", Samsung",456 

Без второго предложения после 27" CSV-бы недействительные и неразборчивые.

Чтобы правильно сканировать строку csv, вам нужно проверить каждый байт.Вот некоторые псевдо-код, который также станет ясно, почему должен быть 2 кавычки (предполагающие нет многострочных полей):

read a line 

bool bInsideQuotes = false 

loop over chars 
    if character == '"' 
    bInsideQuotes = !bInsideQuotes 
    if character == ',' and !bInsideQuotes 
    found a field separator 

Таким образом, вы пропустите , внутри поля. Теперь также легко понять, почему цитаты внутри поля нужно избегать с дополнительной цитатой: bInsideQuotes становится false по адресу 27", а вторая цитата (27"") заставляет bInsideQuotes снова стать true (мы все еще внутри поля).

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

Чтобы использовать строку, удалите 2 внешних кавычки и замените каждые 2 кавычки на 1 кавычку.

+0

Я выводил это в файл csv и у него все еще есть две двойные кавычки? – andyz

+0

@andyz - Да, если поля окружены кавычками, необходимо удвоить котировки внутри: '1253, 'google", 456'. Но не забывайте и внешние цитаты. (возможно, взгляните на исходный файл csv в блокноте, чтобы посмотреть, как все цитируется) –

+0

Тогда как я могу удалить кавычки, которые мне не нужны? т.е. тот же формат, что и вход – andyz

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