Использование FileHelpers; как разобрать этот тип CSV

2

Имея несколько проблем, пытающихся проанализировать 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

3 ответа

2
Лучший ответ

В то время как я благодарю Марка Гравелла и Джона Скита за их вклад, мой вопрос состоял в том, как разобраться с файлом, содержащим строки в формате, описанном с использованием библиотеки 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;
}
2

Очевидным утверждением является "то это не CSV"...

У меня возникнет соблазн использовать быстрое регулярное выражение для того, чтобы изменить дату на одно и то же экранирование, как и все остальное... поэтапно, например:

string t = Regex.Replace(s, @"\[([^\]]*)\]", @"""$1""")

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

1

Каким образом это CSV? Похоже, что это только конкретный формат файла журнала, который должен быть довольно легко проанализирован, но не парсером CSV. В частности, вы вполне можете найти, что регулярное выражение работает отлично. (Вам нужно будет проверить, что произойдет с кавычками в пользовательском агенте и т.д.)

  • 0
    Моя ошибка, я застрял в режиме CSV сегодня, потому что этим я занимался все утро. FileHelpers говорит, что он читает «данные из файлов фиксированной длины или с разделителями в файлах»; Я предположил, что это разделено (пробелами), но у него есть различные кавычки поля. Я посмотрю в регулярное выражение, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню