0

処理する必要がある CSV ファイルがありますが、これはちょっとした悪夢です。本質的には次のとおりです

"Id","Name","Description"
"1","Test1","Test description text"
"2","Test2","<doc><style>body{font-family:"Calibri","sans-serif";}</style><p class="test_class"
name="test_name">Lots of word xdoc content here.</p></doc>"
"guid-xxxx-xxxx-xxxx-xxxx","Test3","Test description text 3"

車輪を再発明するのではなく、 File Helpersライブラリを使用して CSV を処理しています。ただし、引用符を含むエスケープされていない Word xdoc xml を含む説明フィールドが原因で、各レコードの開始点と終了点になるとかなり混乱します。

以下は、マッピング クラスの例です。

[DelimitedRecord(","), IgnoreFirst(1), IgnoreEmptyLines()]
public class CSVDoc
{
    #region Properties
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
    public string Id;
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
    public string Name;
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
    public string Description;
    [FieldQuoted('"', QuoteMode.AlwaysQuoted), FieldTrim(TrimMode.Both)]
}

私は(この種のタスクの正規表現が嫌いであるにもかかわらず) all"を置き換えてから、 pattern を'使用して、行の最初と最後、およびそれらがフォーマットされている場所でallを置き換えることを検討しました。ただし、ダーティ ファイルには、a で終わる行と、フォーマットされた css スタイル属性がいくつか含まれています。((?<=(^|',))'|'(?=($|,')))'"','"","

そのため、これを行う方法と自動化する方法を理解しようとして頭を悩ませています。

何か案は?

4

3 に答える 3

0

それは有効な CSV ではないか、実際には妥当なファイルではないため、車輪を再発明する必要があります。列が正しくエスケープされているかどうか)。

あなたの最善の策は、これを作成した人にバグを修正するよう依頼することです。たとえば、次のようにする必要があります。

"2","Test2","<doc><style>body{font-family:""Calibri"",""sans-serif"";}</style><p class=""test_class""
name=""test_name"">Lots of word xdoc content here.</p></doc>"

パーサーが適切に処理する必要があるものと、単純かつ効率的な方法で生成するのが難しくないもの。

それができない場合は、パーサーを次のように手動でコーディングする必要があります。

  1. 一行読む。
  2. エスケープされていない " ( aまたは空白"が続かないもの) をチェックします。",
  3. 何も見つからない場合は、CSV として解析します。
  4. 見つかった場合は、「」で終わる行に到達するまで、この恐ろしいものとして解析します

<それが他の行で一貫して使用されていない場合は、探しやすいかもしれません。または<doc、正しい行を一貫して識別するかどうかのためかもしれません。

于 2012-08-31T11:26:47.127 に答える
0

前処理をしても構わない場合は、1 番目と 2 番目の "," を "|" に変更できます。次に、FileHelper を使用してファイルを通常どおり解析します (HTML タグがある最後の列に | がないことを前提としています)。

前処理は (単純な疑似コード) のようなものになる可能性があります。

var sb = new StringBuilder()
var regex = new Regex("\",\"");
foreach(string line in textFileLines)
{
   sb.AppendLine(regex.Replace(line , "\"|\"", 2));
}
于 2012-08-31T11:32:15.423 に答える
0

私は数か月前に CSV-1203 ファイル形式標準に取り組んだので、「xyz.CSV」という名前が付いていても、CSV ファイルを扱っていないことに最初に気付きました。

ここで他の人が言ったように、独自のリーダーを作成する方が簡単です。それほど難しくありません。私もすべての正規表現が嫌いですが、良いニュースは、それを使用せずに任意のソリューションをコーディングできることです。

いくつかのこと: Excel が 2 つの大文字 ID (引用符なし) で始まる CSV ファイルに対して実行する、非常に奇妙な処理があります。あなたの CSV は破損した SYLK ファイルであると考えられています! それを試してみてください。

この問題の詳細と詳細な CSV ファイル形式の仕様については、http://mastpoint.curzonnassau.com/csv-1203を参照してください。

于 2012-09-02T13:53:04.997 に答える