csv文件,行中的列数不同

时间:2017-11-07 08:18:44

标签: 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|Bob     |1 |605212999|02|T3_1018_RM    |0

CSV列:

ID|Name|Telephones Count|TelephoneNumber|TypeTelephone...|IDType|ProductType

第1行和第2行有2部电话(号码和类型):

     605212999|02
     663790000|02

第3行有1部电话(号码和类型):

     605212999|02

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

我尝试类似这样的事情:

StreamReader sr = new StreamReader(filename);
var csvList = new List<string[]>();
while(!sr.EndOfStream)
{
    String[] header = sr.ReadLine().Split('|');
    csv.Add(header); 
}

使用FileHelpers不适用FixedLengthRecord

[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;
}

或使用http://www.filehelpers.net/example/QuickStart/ReadWriteRecordByRecord/既不适用

1 个答案:

答案 0 :(得分:1)

FileHelpers 可以与可变长度记录一起使用。固定长度属性为:

[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());