C# 行中列数不同的csv文件
我们正在读取一个CSV文件,其中有不同的记录格式 第一个记录始终有3列。这是头球 其他记录的列数可变 分离器是管道|。 列具有固定长度(每种列类型具有其固定长度) 我正在尝试使用FileHelpers解析这种类型的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
*|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());