コード例 #1
0
        /// <summary>
        /// インポート用関数登録
        /// </summary>
        public void RegisterImporter <Value>(ImporterFunc <Value> importer)
        {
            InternalImporterFunc importer_wrapper = delegate(string str) {
                return(importer(str));
            };

            importerTable[typeof(Value)] = importer_wrapper;
        }
コード例 #2
0
        /// <summary>
        /// CSV文字列strをListへ変換する
        /// </summary>
        public List <T> ToObject <T>(string str)
            where T : new()
        {
            // //Log.Debug("str:\n---\n{0}\n---", str);
            // 渡された型のpublicなフィールドを取得
            // FieldInfo[] fields = typeof(T).GetFields();
            // 解析
            csvRawData = CSVParser.CsvToArrayList(str);
            //Log.Assert(csvRawData.Count > 0, "CsvHeaderError");

            // 最初の一行目をフィールド名として使用
            // var csvFieldName = csvRawData[0];
            // フィールド名が空白になっているものが見つかったらそれ以降を無視
            var names = new List <string>();

            foreach (var s in csvRawData[0])
            {
                if (s == "")
                {
                    break;
                }
                names.Add(s);
            }
            csvFieldName = names.ToArray();

            List <T> csvdata = new List <T>();

            for (int i = 1; i < csvRawData.Count; ++i)
            {
                string[] line = csvRawData[i];

                // 空白データしかない列は無視するとき
                if (ignoreEmptyLine)
                {
                    bool empty_line = true;
                    foreach (string value in line)
                    {
                        if (value != "")
                        {
                            empty_line = false;
                            break;
                        }
                    }
                    if (empty_line)
                    {
                        // //Log.Warning("空データしかない行がみつかりました。");
                        continue;
                    }
                }

                T field = new T();
                try {
                    for (int j = 0; j < line.Length && j < csvFieldName.Count(); ++j)
                    {
                        // フィールド名に'#'が入っていたら無視
                        if (csvFieldName[j].IndexOf('#') >= 0)
                        {
                            continue;
                        }

                        // フィールド名に対応したクラスのフィールドを取得
                        FieldInfo fieldinfo = typeof(T).GetField(csvFieldName[j]);

                        if (fieldinfo != null)
                        {
                            // 対応するフィールドがあるとき
                            //Log.Assert(importerTable.ContainsKey(fieldinfo.FieldType), "{0}型へ変換できません。", fieldinfo.FieldType);

                            // 文字列を適切な型に変換
                            InternalImporterFunc importer = importerTable[fieldinfo.FieldType];
                            fieldinfo.SetValue(field, importer(line[j]));
                        }
                        else if (fieldinfo == null && field as IDictionary <string, string> != null)
                        {
                            // ディクショナリに追加できるとき
                            IDictionary <string, string> dic = field as IDictionary <string, string>;
                            dic.Add(csvFieldName[j], line[j]);
                        }
                        else
                        {
                            // 追加できないとき
                            //Log.Assert(fieldinfo != null, "'{0}' に '{1}'フィールドがありません。", typeof(T).FullName, csvFieldName[j]);
                        }
                    }
                } catch (Exception e) {
                    //Log.Warning("CSVエラー line:{0} e:{1}", i, e.ToString());
                    throw e;
                }

                // 追加
                csvdata.Add(field);
            }

            return(csvdata);
        }