2009-06-05 7 views
2

FileHelpersライブラリを使用して次の形式でCSVを解析しようとすると、いくつかの問題があります。フィールド区切り文字は空白のように見えるので、私は少し混乱しますが、フィールド自体は引用符で囲まれていることがありますが、他のときは角括弧で囲まれていることがあります。私はこれを解析することができる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

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

どのようにCSVですか? CSVパーサーではなく、かなり簡単に解析する必要がある特定のログファイル形式のようです。特に、正規表現が完全にうまく動作することが分かります。明白な声明「それはCSVではありません」され

+0

私のミス、今日のCSVモードは、これが私が午前中に行ってきたことです。 FileHelpersは、 "固定長のデータまたはファイル内の区切られたレコードからデータを読み込む"と言います。私はこれがスペースで区切られていると推測しましたが、フィールドの引用符は異なっています。私は正規表現を見ていきます、ありがとう。 – Richard

2

を(あなたはなど、ユーザーエージェントで引用符に何が起こるかを確認する必要があると思います)...

私が使用するように誘惑されるだろう同じことが他のすべてのようにエスケープに日付をのmungeするための簡単な正規表現は...ラインごとに、のようなもの:

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

その後、区切り文字としてスペースを使用して、標準的なパーサを使用することができるはずです(引用符を尊重する)。

関連する問題