我们正在阅读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/既不适用
答案 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());