2

尝试使用 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 日志的摘录。

4

3 回答 3

3

虽然我感谢 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;
}
于 2009-06-05T13:01:07.597 回答
2

显而易见的陈述是“那么它不是CSV”......

我很想使用快速正则表达式将日期转换为与其他所有内容相同的转义...逐行进行,例如:

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

然后您应该能够使用标准解析器,使用空格作为分隔符(尊重引号)。

于 2009-06-05T10:11:52.667 回答
1

CSV 是怎样的?看起来它只是一种特定的日志文件格式,应该很容易解析,但不是 CSV 解析器。特别是,您可能会发现正则表达式运行良好。(您需要检查用户代理等中的引号会发生什么情况。)

于 2009-06-05T10:10:26.600 回答