FileHelpers使用FieldQuoted读取csv并在多行中添加了“”字符

时间:2019-05-21 10:38:38

标签: c# filehelpers

使用FileHelpers库读取csv文件时遇到麻烦:

  1. 我有一个csv文件,其中有些行,如果第一行也具有“字符”,第二行也具有“”字符,那么第二行将是读取后第一行的最后一列。

  2. 如果我的csv文件中有几行,所有行都有一行,而其中有一行字符,则该行将被忽略。

真的需要帮助!

这是我的课程

[DelimitedRecord(",")]
[IgnoreEmptyLines()]
[IgnoreFirst()]

public sealed class MyClass
{

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
    [FieldTrim(TrimMode.Both)]
    public String NAME;

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
    [FieldTrim(TrimMode.Both)]
    public String NOTES;
}

还有我读取的文件代码:

OpenFileDialog ofd = new OpenFileDialog
{
    Filter = "CSV files (*.csv)|*.csv",
    FilterIndex = 0,
    CheckFileExists = true,
    RestoreDirectory = true
};

if (ofd.ShowDialog(this) == DialogResult.OK)
{
    if (AppSetting.IsFileLocked(ofd.FileName))
    {
        //file in is use
        MessageUtility.ShowNotify(LanguagesMessage.GetLanguagesMessage("USING"));
        return;
    }
    else
    {
        FileInfo f = new FileInfo(ofd.FileName);
        if (f.Extension != ".csv")
        {
            MessageUtility.ShowNotify(MsgFormatFile);
            return;
        }
    }

    var _curr_encoding = SimpleHelpers.FileEncoding.DetectFileEncoding(ofd.FileName);

    if (_curr_encoding == null)
    {
        MessageUtility.ShowNotify(MsgFormatFile);
        return;
    }

    if (_curr_encoding.CodePage == _encoding_export_import.CodePage)
    {
        _curr_encoding = _encoding_export_import;
    }
    else
    {
        _curr_encoding = Encoding.GetEncoding(_curr_encoding.CodePage);
    }

    var engine = new FileHelperEngine<MyClass>(_curr_encoding);
    engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;
    engine.Encoding = _curr_encoding;
    engine.AfterReadRecord += Engine_AfterReadRecord;

    List<MyClass> lstDataImports = engine.ReadFile(ofd.FileName).ToList();

    if (engine.ErrorManager.ErrorCount > 0)
    {
        MessageUtility.ShowNotify(MsgFormatFile);
        engine.ErrorManager.SaveErrors("Errors.txt");
        return;
    }
    else
    {
        if (lstDataImports.Count() < 1)
        {
            MessageUtility.ShowNotify(LanguagesMessage.GetLanguagesMessage_SM("MY_ERROR"));
            return;
        }
    }
    if (!ValidateHeader(engine.HeaderText))
    {
        return;
    }
}

1 个答案:

答案 0 :(得分:1)

当使用MyClassQuoteMode.OptionalForBoth配置MultilineMode.AllowForBoth时,这是预期的行为。

说明:您可以引用这些字段(通过归因QuoteMode.OptionalForBoth),并允许记录在下一行继续(通过归因MultilineMode.AllowForBoth)。

您还必须记住,如果不清楚的话,引号就是您要读取的记录前后的引号。