[英]Using FileHelpers; how to parse this CSV type
嘗試使用FileHelpers庫解析以下格式的CSV時遇到一些問題。 這讓我有些困惑,因為字段定界符似乎是一個空格,但是字段本身有時用引號引起來,而有時用方括號引起。 我試圖產生一個能夠解析此的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日志的摘錄。
明顯的說法是“那么它不是CSV” ...
我很想使用快速的正則表達式將日期與其他所有內容轉義為相同的轉義...逐行,例如:
string t = Regex.Replace(s, @"\[([^\]]*)\]", @"""$1""")
然后,您應該能夠使用使用空格作為定界符的標准解析器(使用引號)。
盡管我感謝Marc Gravell和Jon Skeet的輸入,但我的問題是如何解析包含使用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是哪種方式? 看起來,這只是一種特定的日志文件格式,應該相當容易地進行解析,而不是通過CSV解析器進行解析。 特別是,您可能會發現正則表達式可以很好地工作。 (您需要檢查用戶代理等中的報價會發生什么情況。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.