4

優れた FileHelpers ライブラリを使用して、さまざまなファイルを解析しています。これらのファイルの 1 つに、次のような (いくつかの) 行があります。

id|name|comments|date
01|edov|bla bla bla bla|2012-01-01
02|john|bla bla bla bla|2012-01-02
03|Pete|bla bla <NEWLINE>
bla bla|2012-03-01
04|Mary|bla bla bla bla|2012-01-01

ID 3 の行には、テキストに改行があることに注意してください。また、コメントは引用符で囲まれてい[FieldQuoted('"', MultilineMode.AllowForRead)]ないため、私を救うつもりはないことに注意してください。

Filehelpers は 4 行目で例外をスローします。

区切り文字 '|' フィールド 'comments' の後に見つかりません (レコードのフィールドが少ないか、区切り文字が間違っているか、次のフィールドをオプションとしてマークする必要があります)。

このファイルを FileHelpers で解析できる方法はありますか?

4

1 に答える 1

3

FileHelpers エンジンに渡す前に、3 番目のフィールドに引用符を追加して入力を修正する必要があります。次のプログラムに示すように、LINQ を使用すると簡単に実行できます。

[DelimitedRecord("|")]
[IgnoreFirst(1)]
public class ImportRecord
{
    public string Id;
    public string Name;
    [FieldQuoted(QuoteMode.AlwaysQuoted, MultilineMode.AllowForRead)]
    public string Comments;
    public string Date;
}

class Program
{
    static void Main(string[] args)
    {
        var engine = new FileHelperEngine<ImportRecord>();

        string input = "id|name|comments|date" + Environment.NewLine +
                              "01|edov|bla bla bla bla|2012-01-01" + Environment.NewLine +
                              "02|john|bla bla bla bla|2012-01-02" + Environment.NewLine +
                              "03|Pete|bla bla" + Environment.NewLine +
                              "bla bla|2012-03-01" + Environment.NewLine +
                              "04|Mary|bla bla bla bla|2012-01-01";

        // Modify import to add quotes to multiline fields
        var inputSplitAtSeparator = input.Split('|');
        // Add quotes around the field after every third '|'
        var inputWithQuotesAroundCommentsField = inputSplitAtSeparator.Select((x, i) => (i % 3 == 2) ? "\"" + x + "\"" : x);
        var inputJoinedBackTogether = String.Join("|", inputWithQuotesAroundCommentsField);

        ImportRecord[] validRecords = engine.ReadString(inputJoinedBackTogether);

        // Check the third record
        Assert.AreEqual("03", validRecords[2].Id);
        Assert.AreEqual("Pete", validRecords[2].Name);
        Assert.AreEqual("bla bla" + Environment.NewLine + "bla bla", validRecords[2].Comments);
        Assert.AreEqual("2012-03-01", validRecords[2].Date);

        Console.WriteLine("All assertions passed");
        Console.ReadKey();
    }
}
于 2012-07-20T11:26:20.257 に答える