如何处理某些字符串字段包含 CR 字符和 LF 字符的 CSV 文件

问题描述 投票:0回答:1

我的班级是

    [IgnoreFirst(1)]
    [DelimitedRecord("#")]

    public class PrezElementi
    {
    public int idElemento { get; set; }
        public string? Descrizione { get; set; }
    }

    var engine = new FileHelperEngine<PrezElementi>();
    var res = engine.ReadFile("myfile.csv");

我的示例文件是

#123#line A#
#456#line B
end line B#
#789#line C#

读取第二行时,出现错误<>

是否有方法告诉 FileHelper 将“Description”字段视为两行?

c# filehelpers
1个回答
0
投票

是否有方法告诉 FileHelper 将“Description”字段视为两行?

是的,但它只适用于 QuotedStrings,所以对你没有帮助。

在您的特定情况下,仅因为相关字段恰好是最后一个字段,您可以使用 BeforeRecord 事件来检测第二行并将其与上一行合并,然后忽略它。

例如类似的东西

void Main()
{    
    string input = @"#123#line A#
    #456#line B
    end line B#
    #789#line C#
    ";
      
    var engine = new FileHelperEngine<PrezElementi>();
    engine.BeforeReadRecord += new FileHelpers.Events.BeforeReadHandler<PrezElementi>(beforeRead);    
    var results = engine.ReadString(input);     
}

public static PrezElementi? lastRecord  ;

void beforeRead(EngineBase engine, BeforeReadEventArgs<PrezElementi> e)
{
    if (!e.RecordLine.StartsWith('#'))
    {
        ArgumentNullException.ThrowIfNull(lastRecord);
        lastRecord.Descrizione += "\r\n" + e.RecordLine;
        e.SkipThisRecord = true;
    }
    else
    {
        lastRecord = e.Record;
    }
}

[IgnoreFirst(0)]
[DelimitedRecord("#")]

public class PrezElementi
{ 
    string? ignore1 { get; set; }
    
    public int? idElemento { get; set; }
    public string? Descrizione { get; set; }
 
    [FieldOptional] public string? ignore2 { get; set; }
}

由于您的示例以分隔符开始和结束,因此您需要在开始和结束处引入虚拟字段。 (我不确定为什么ignore2需要公开,但它似乎不起作用)

© www.soinside.com 2019 - 2024. All rights reserved.