Имея несколько проблем, пытающихся проанализировать CSV в следующем формате, используя библиотеку FileHelpers. Это меня немного сбивает с толку, потому что полевой ограничитель представляется пространством, но сами поля иногда цитируются кавычками, а иногда - квадратными скобками. Я пытаюсь создать RecordClass, способный разбирать это.
Здесь образец из CSV:
xxx.xxx.xxx.xxx - - [14/Jun/2008:18:04:17 +0000] "GET http://www.some_url.com HTTP/1.1" 200 73662339 "-" "iTunes/7.6.2 (Macintosh; N; Intel)"
Это выписка из протокола HTTP, которую мы получаем от одного из наших провайдеров пропускной способности.
В то время как я благодарю Марка Гравелла и Джона Скита за их вклад, мой вопрос состоял в том, как разобраться с файлом, содержащим строки в формате, описанном с использованием библиотеки FileHelpers (хотя, я сформулировал это плохо, чтобы начать с описания "CSV", когда на самом деле это не так).
Теперь я нашел способ сделать именно это. Однако это не самый элегантный способ, однако он выполняет свою работу. В идеальном мире я бы не использовал FileHelpers в этой конкретной реализации;)
Для тех, кто заинтересован, решение состоит в создании класса FileRecord следующим образом:
[DelimitedRecord(" ")]
public sealed class HTTPRecord
{
public String IP;
// Fields with prefix 'x' are useless to me... we omit those in processing later
public String x1;
[FieldDelimiter("[")]
public String x2;
[FieldDelimiter("]")]
public String Timestamp;
[FieldDelimiter("\"")]
public String x3;
public String Method;
public String URL;
[FieldDelimiter("\"")]
public String Type;
[FieldIgnored()]
public String x4;
[FieldDelimiter(" ")]
public String x5;
public int HTTPStatusCode;
public long Bytes;
[FieldQuoted()]
public String Referer;
[FieldQuoted()]
public String UserAgent;
}
Очевидным утверждением является "то это не CSV"...
У меня возникнет соблазн использовать быстрое регулярное выражение для того, чтобы изменить дату на одно и то же экранирование, как и все остальное... поэтапно, например:
string t = Regex.Replace(s, @"\[([^\]]*)\]", @"""$1""")
Затем вы должны иметь возможность использовать стандартный синтаксический анализатор, используя пробел в качестве разделителя (соответствующие цитаты).
Каким образом это CSV? Похоже, что это только конкретный формат файла журнала, который должен быть довольно легко проанализирован, но не парсером CSV. В частности, вы вполне можете найти, что регулярное выражение работает отлично. (Вам нужно будет проверить, что произойдет с кавычками в пользовательском агенте и т.д.)