C# 行中列数不同的csv文件

C# 行中列数不同的csv文件,c#,csv,filehelpers,C#,Csv,Filehelpers,我们正在读取一个CSV文件,其中有不同的记录格式 第一个记录始终有3列。这是头球 其他记录的列数可变 分离器是管道|。 列具有固定长度(每种列类型具有其固定长度) 我正在尝试使用FileHelpers解析这种类型的CSV文件: *|060318|4 1|Tom |2 |605212999|02|663790000|02|T3_1018_RM |0 2|Steve |2 |605212999|02|663790000|02|T3_1018_RM |0 3|Bo

我们正在读取一个CSV文件,其中有不同的记录格式

第一个记录始终有3列。这是头球

其他记录的列数可变

分离器是管道|。 列具有固定长度(每种列类型具有其固定长度)

我正在尝试使用FileHelpers解析这种类型的CSV文件:

*|060318|4       
1|Tom     |2 |605212999|02|663790000|02|T3_1018_RM    |0
2|Steve   |2 |605212999|02|663790000|02|T3_1018_RM    |0
3|Bob     |1 |605212999|02|T3_1018_RM    |0
CSV列:

ID|Name|Telephones Count|TelephoneNumber|TypeTelephone...|IDType|ProductType
1号线和2号线有2部电话(电话号码和类型):

3号线有1部电话(数量和类型):

是否可以使用FileHelpers或其他通用代码

我试着这样做:

StreamReader sr = new StreamReader(filename);
var csvList = new List<string[]>();
while(!sr.EndOfStream)
{
    String[] header = sr.ReadLine().Split('|');
    csv.Add(header); 
}
或者使用两者都不适用

文件助手可用于可变长度记录。固定长度属性应为:

[FixedLengthRecord(FixedMode.AllowLessChars)]
不过,我不会使用固定长度方法,因为它会将分隔符视为实际数据。因此,您可以使用:

[DelimitedRecord("|")]
public class Customer
{
    public int CustId { get; set; }

    [FieldTrim(TrimMode.Right)]
    public string Name { get; set; }

    [FieldConverter(ConverterKind.Date, "ddMMyyyy")]
    public DateTime AddedDate { get; set; }

    [FieldOptional] // <-- 
    public string OptionalColumn { get; set; }

    [FieldOptional] // <-- 
    public string OtherOptionalColumn { get; set; }
}
[分隔符记录(“|”)
公共类客户
{
public int CustId{get;set;}
[现场微调(微调模式。右侧)]
公共字符串名称{get;set;}
[FieldConverter(ConverterKind.Date,“ddMMyyyy”)]
公共日期时间添加数据{get;set;}

[FieldOptional]//有许多可选列。对于示例:
必需的列1、OptionalColumn1、optionalcolumn2、…OptionalColumn、必需的列2、必需的列3
@Kiquenet只要添加
[FieldOptional],就可以为可选列的属性指定任何名称
属性。请参阅更新后的答案。有一列包含电话号码。例如,当以下列为电话号码并键入电话时,有两个值(
01,02表示手机
)。例如:
| 2 | 605212115 | 02 | 663794042 | 02 |
听起来那一栏是多余的吗?如果你能通过一行的管道字符数来确定列数,我看不出“电话数”栏有什么用。顺便说一句,问题没有提到这一栏,它已经有4个月了。
[FixedLengthRecord()]
public class Customer
{
    [FieldFixedLength(1)]
    public int Id;

    [FieldFixedLength(8)]
    [FieldTrim(TrimMode.Both)]
    public string Name;

    [FieldFixedLength(2)]
    [FieldTrim(TrimMode.Both)]
    public int TelephoneCount;

    ....
    public string Phone1;
    public byte Phone1Type;

    public string Phone2;
    public byte Phone2Type;

    ...
    public string Phone9;
    public byte Phone9Type;

    [FieldFixedLength(14)]
    [FieldTrim(TrimMode.Both)]
    public string IDType;

    [FieldFixedLength(1)]
    public int ProductType;
}
[FixedLengthRecord(FixedMode.AllowLessChars)]
[DelimitedRecord("|")]
public class Customer
{
    public int CustId { get; set; }

    [FieldTrim(TrimMode.Right)]
    public string Name { get; set; }

    [FieldConverter(ConverterKind.Date, "ddMMyyyy")]
    public DateTime AddedDate { get; set; }

    [FieldOptional] // <-- 
    public string OptionalColumn { get; set; }

    [FieldOptional] // <-- 
    public string OtherOptionalColumn { get; set; }
}
StringBuilder data = new StringBuilder();
data.AppendLine("12345|PETE PETERSON                 |01012001");
data.AppendLine("54321|SUSAN SMITH                   |11112011|Hello");
var customers = new FileHelperEngine<Customer>().ReadString(data.ToString());