Мне нужно написать ужасный интерфейс для импорта данных в новую базу данных из сотен файлов данных из нашего старого приложения, которое имеет все жесткое кодирование (отображаемые данные напоминают электронные таблицы Excel, и это позволяет мы экспортируем данные в значения, разделенные запятыми).C#: Сопоставление типа данных
Я могу прочитать все это, с именами заголовков.
Из этого я могу сгенерировать имя для столбца, который будет использоваться в базе данных Sql CE.
Данные в настоящее время состоит из float
, int
, DateTime
, bit
, char
и string
.
Я пришел с способом, чтобы сделать это (непроверено по всем нашим данным), но любая помощь от кого-то, кто знает, как кодировать это лучше, будет с благодарностью.
Код, указанный ниже, не требуется для чтения, если только кто-то не понимает, что я прошу.
public enum MyParameterType { NA, Float, Bool, Char, Date, Int, String }
class MyParameter {
public MyParameter(string name, string value) {
if (String.IsNullOrEmpty(name) || String.IsNullOrEmpty(value)) {
throw new NotSupportedException("NULL values are not allowed.");
}
Name = name.Trim();
Value = value.Trim();
Type = MyParameterType.NA;
if (-1 < Value.IndexOf('.')) { // try float
float f;
if (float.TryParse(Value, out f)) {
string s = f.ToString();
if (s == Value) {
Parameter = new SqlCeParameter(AtName, SqlDbType.Float) { Value = f };
Type = MyParameterType.Float;
}
}
}
if (Type == MyParameterType.NA) {
bool b;
if (bool.TryParse(Value, out b)) {
Parameter = new SqlCeParameter(AtName, SqlDbType.Bit) { Value = b };
Type = MyParameterType.Bool;
}
}
if (Type == MyParameterType.NA) {
if (Value.Length == 1) {
char c = Value[0];
Parameter = new SqlCeParameter(AtName, SqlDbType.Char) { Value = c };
Type = MyParameterType.Char;
}
}
if (Type == MyParameterType.NA) {
DateTime date;
if (DateTime.TryParse(Value, out date)) {
Parameter = new SqlCeParameter(AtName, SqlDbType.DateTime) { Value = date };
Type = MyParameterType.Date;
}
}
if (Type == MyParameterType.NA) {
if (50 < Value.Length) {
Value = Value.Substring(0, 49);
}
Parameter = new SqlCeParameter(AtName, SqlDbType.NVarChar, 50) { Value = this.Value };
Type = MyParameterType.String;
}
}
public string AtName { get { return "@" + Name; } }
public string Name { get; set; }
public MyParameterType Type { get; set; }
public SqlCeParameter Parameter { get; set; }
public string Value { get; set; }
}
Мое самое большое беспокойство в том, что я не хочу, чтобы ошибочно интерпретируют один из входов (например, логическое значение, чтобы быть символ).
Я также ищу способ сравнить новые экземпляры MyParameter
(т. Е. Если он меньше одного типа, попробуйте другой тип).
Бонусные баллы за просмотр замечательных новых выражений для создания этого!
[Code Review] (http://codereview.stackexchange.com/), возможно, является более подходящим местом для этого вопроса. –
@Steven: может быть, он мог бы перекрестно опубликовать его, но я думаю, что это достаточно интересно, чтобы оставаться на SO в настоящее время. – user7116
Вы можете только _assume_ тип, основанный на строках, которые вы в настоящее время читаете из файла данных, поэтому я предлагаю вам прочитать все строки в файле и настроить «лучшее предположение» по мере того, как вы идете. Учитывая ваш список типов, столбец, который будет содержать целое число, может быть «понижен» до поплавка или символа или строки - чем больше строк вы прочтете, тем дальше по этому склону вы можете пойти. –