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)"

これは、帯域幅プロバイダーの 1 つから受け取った 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 に答える