FileHelpers DelimiterFieldBuilder问题

时间:2013-01-24 08:06:13

标签: c# filehelpers

我有这个简单的文件。

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
  • 案例1:使用静态类型类进行阅读: 我得到了相同的结果:有一个默认的姓氏
  • 案例2:使用动态创建的对象进行阅读: 它不再制动,但没有默认值,只有“”

1 个答案:

答案 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;
    }
}