2012-03-15 2 views
0

Отказ от ответственности: Я на самом деле не разбираю CSV, а CSV-подобный формат; Я не заинтересован в использовании встроенной библиотеки.Разбор CSV: краевые случаи

Что такое правильный способ разобрать следующие 2 строки ?:

a,b"c"d,e 
a,"bc"d,e 

т.е. (а) с кавычками в середине значения, и (б) с цитатой в начале, но без котировки сразу перед следующим значением.

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


Мои мысли, что (а) должно быть разобрано как a, b"c"d, e (котировки оставили в), и (б) должны быть разобраны таким же образом, a, "bc"d, e. Но тогда позвольте мне представить 3-й случай, a,"b,c"d,e - разделим ли мы на эту вторую запятую между «b» и «c» или нет?

+0

В конечном счете это зависит от того, что именно вы позволяете между сепараторами - и как вы хотите для толкования. Там нет правильного пути, вы должны определить правила. – moodywoody

+0

@moodywoody: Ну, как другие парсеры справляются с этими случаями? Как пользователь, если вы вводили список тегов, разделенных запятыми (аналогично тегам SO, но с разделителем запятой), какое поведение вы ожидали бы? – mpen

+0

Мне лично, когда дело доходит до цитат и т. Д., Я ничего не жду - я прошу определения (я знаю, что это немного из-за копа, но мне нравятся мои проблемы «хорошо определены»). Во всяком случае, вы можете найти эти две ссылки, связанные с файлами perl и csv, интересными http://stackoverflow.com/questions/633607/how-can-i-parse-quote-csv-in-perl-with-a-regex. http://www.en8848.com.cn/Reilly%20Books/perl3/cookbook/ch01_16.htm. – moodywoody

ответ

0

здесь является частью моего метода (C#) плюнуть CSV в HTML таблицу - она ​​имеет такую ​​запятую разбор:

string[] cells = line.Split(','); // empty cells needed as well 
bool noComma = true; 

for (int i = 0; i < cells.Length; i++) 
{ 
    string cellI = cells[i]; 
    int numberOfDoubleQuote = cellI.Count(f => f == '"'); 
    // == 0 means comma in between quotes 
    if (numberOfDoubleQuote == 1) 
    { 
     noComma = !noComma; 
     if (!noComma) 
      sLine += "<td>" + cellI; 
     else 
      sLine += "," + cellI + "</td>"; 
    } 
    else 
    { 
     if (noComma) 
      sLine += "<td>" + cellI + "</td>"; 
     else 
      sLine += "," + cellI; 
    } 
} 
+0

Итак, вы по существу разделяете все запятые и затем присоединяете ячейки, если они содержат одну цитату ... но я не думаю, что вы хорошо рассмотрели дела. Например, как бы он обрабатывал «a, b», c'? Если я прочитаю это право, он выдаст 'a',' b ', c', что кажется неправильным. – mpen

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