FileHelpers считывает CSV с FieldQuoted, имеющего "символ в многострочном поле - PullRequest
0 голосов
/ 21 мая 2019

У меня проблема с чтением CSV-файла с помощью библиотеки FileHelpers, например:

  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 Ответ

1 голос
/ 21 мая 2019

Это ожидаемое поведение при настройке MyClass с QuoteMode.OptionalForBoth и MultilineMode.AllowForBoth.

Объяснение: вы разрешаете цитирование этих полей (приписывая QuoteMode.OptionalForBoth) и разрешаете продолжить запись в следующей строке (указав MultilineMode.AllowForBoth).

Вы должны также помнить, если неясно, что цитирование - это акт установки кавычки до и после записи, которую вы хотите прочитать.

...