3

CSVファイルの受け渡しに依存する別のシステム(本当に古い学校)との統合があります。

構造は一般的に次のとおりです。

ID, Name, PhoneNumber, comments, fathersname
1, tom, 555-1234, just some random text, bill
2, jill smith, 555-4234, other random text, richard

時々私たちはこれを見ます:

3, jacked up, 999-1231, here  
be dragons  
amongst us, ted

\n私が気にかけている主な問題は、レコードのターミネータであるときに、レコードの途中で改行()が発生することを検出することです。

とにかくこれを前処理して確実に修正することはできますか?

他のシステムが放出するものを制御できないことに注意してください。

4

3 に答える 3

1

したがって、多かれ少なかれ次のようなことができるはずです。

for (int i = 0; i < lines.Count; i++)
{
    var fields = lines[i].Split(',').ToList();
    while (fields.Count < numFields)//here be dragons amonst us
    {
        i++;//include next line in this line
        //check to make sure we haven't run out of lines.

        //combine end of previous field with start of the next one, 
        //and add the line break back in.
        var innerFields = lines[i].Split(',');
        fields[fields.Count - 1] += "\n" + innerFields[0];

        fields.AddRange(innerFields.Skip(1));
    }

    //we now know we have a "real" full line
    processFields(fields);
}

(簡単にするために、最初にすべての行が読み込まれたと仮定しました。各行を簡単に遅延フェッチするように変更できると思います。)

于 2012-11-15T22:16:25.737 に答える
0

まず、例のCSVファイルが無効であると言いましょう。文字列内で改行が発生する場合は、二重引用符で囲む必要があります。

答えは次のとおりです。この無効なcsv形式を解析するには、いくつかの仮定を行う必要があります。この場合、私は2つの仮定をしました:1)ID列は数字でなければなりません2)コメントフィールドに数字を含めることはできません。

これらの仮定に基づいて、改行文字の後の最初の文字を確認できます。数字の場合は、新しいレコードと見なします。そうでない場合は、コメントフィールドの継続値として扱う必要があります。

2番目の仮定が有効かどうかはわかりません。有効でない場合は、システムのビジネスルールをカバーするようにロジックを拡張できます。

幸運を!

于 2012-11-15T22:21:15.883 に答える
0

まず、csvファイルの読み取りと書き込みを管理するツールを使用することをお勧めします。FileHelpersライブラリを使用します。これはすばらしい機能です。

基本的にレコードを入力でき、すべての検証などが行われます。努力する価値があります。

あなたの質問に対して、おそらくあなたはファイルに対していくつかの前処理を行い、正規表現を使用して改行をスペースに置き換えることができますか?

私は(ファイルではなく)似たようなことをします

line.Replace(Environment.NewLine, " ");

FileHelpersを使用すると、処理中にこれを行うカスタムコンバーターを作成したり、BeforeReadイベントにフックしたりできます。

于 2012-11-15T22:26:26.173 に答える