2009-06-05 7 views
2

Имея несколько проблем, пытающихся проанализировать CSV в следующем формате, используя библиотеку FileHelpers. Это меня немного сбивает с толку, потому что полевой ограничитель представляется пространством, но сами поля иногда цитируются кавычками, а иногда - квадратными скобками. Я пытаюсь создать RecordClass, способный разбирать это.Использование FileHelpers; как разобрать этот CSV-тип

Вот пример из 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 мы получаем от одного из наших поставщиков пропускной способности.

ответ

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; 
} 
1

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

+0

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

2

Очевидное утверждение является «то это не CSV» ...

Я был бы соблазн использовать быстрое регулярное выражение для munge даты в то же побеге, как и все остальное ... на основе линии за линией, что-то вроде:

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

Тогда вы должны быть в состоянии использовать стандартный анализатор использование пространства в качестве разделителя (соблюдение котировок).

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

  • Нет связанных вопросов^_^