我有这个简单的文件。
first name 1,last name 1
first name 2
first name 3,last name 3
first name 4,last name 4
案例1:我使用此类从文件中读取数据:
[DelimitedRecord(",")]
public partial class Person
{
private string firstName;
[FieldNullValue("default last name")]
private string lastName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
}
和此代码
ExcelStorage provider = new ExcelStorage(typeof(Person));
provider.FileName = "data.csv";
Person[] res = provider.ExtractRecords() as Person[];
我正确获取数据,数组中的第二个元素具有姓氏=默认姓氏。
案例2:我使用动态构建类型读取数据:
DelimitedClassBuilder cb = new DelimitedClassBuilder("Person2", ",");
cb.AddField("firstName", typeof(string));
cb.AddField("lastName", typeof(string));
cb.LastField.FieldNullValue = "default last name";
DelimitedFileEngine engine = new DelimitedFileEngine(cb.CreateRecordClass());
DataTable dt = engine.ReadFileAsDT("data.csv");
我收到以下异常:Line: 2 Column: 0. Delimiter ',' not found after field 'firstName' (the record has less fields, the delimiter is wrong or the next field must be marked as optional).
让我们像这样更改文件,在第二行添加分隔符
first name 1,last name 1
first name 2,
first name 3,last name 3
first name 4,last name 4
答案 0 :(得分:0)
首先,您应该将第二个字段设置为可选。
cb.LastField.FieldNullValue = "default last name";
然后您不需要添加逗号。
其次,如果添加逗号,则需要更改动态运行时类处理空字段的方式。 ClassBuilder
并未将string.Empty
视为null
(这可能是一个错误,因为它与您未动态创建类的第一种方法不同)。但是你可以提供一个简单的转换器来处理这个问题。
cb.LastField.Converter.TypeName = typeof(NullValueConverter).ToString();
这是转换器的代码
public class NullValueConverter : ConverterBase
{
public override object StringToField(string stringSource)
{
return stringSource;
}
public override string FieldToString(object fieldValue)
{
// treat string.empty as null
string result = fieldValue.ToString();
if (string.IsNullOrWhiteSpace(result))
return null;
return result;
}
}