Использование FileHelpers; как разобрать этот тип CSV - PullRequest
2 голосов
/ 05 июня 2009

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

Ответы [ 3 ]

2 голосов
/ 05 июня 2009

Очевидное утверждение "тогда это не CSV" ...

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

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

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

2 голосов
/ 05 июня 2009

Хотя я благодарю Марка Гравелла и Джона Скита за их ввод, мой вопрос заключался в том, как выполнить синтаксический анализ файла, содержащего строки в формате, описанном с помощью библиотеки 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 голос
/ 05 июня 2009

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

...