1

私はこの単純なファイルを持っています。

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 番目の要素には姓 = デフォルトの姓があります。

  • ケース 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).

このようにファイルを変更して、2 行目にセパレーターを追加してみましょう

first name 1,last name 1
first name 2,
first name 3,last name 3
first name 4,last name 4
  • ケース 1: 静的型付きクラスを使用した読み取り: 同じ結果が得られます: デフォルトの姓があります
  • ケース 2: 動的に作成されたオブジェクトを使用した読み取り: もうブレーキはかかりませんが、デフォルト値はなく、"" だけがあります。
4

1 に答える 1

0

まず、2 番目のフィールドをオプションに設定する必要があります。

  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;
    }
}
于 2013-03-15T10:38:41.170 に答える