План А кажется разумным. Я не думаю, что было бы слишком много имен полей (если они есть) с запятыми или табуляцией. Таким образом, статистика будет точной в 90% случаев. Если статистика достаточно «близка» (например, 15 запятых и 12 вкладок), вы можете сделать следующее:
int i = line.IndexOf("email", StringCompareOptions.CultureInvariantIgnoreCase);
if(i == -1) i = line.IndexOf("e-mail", StringCompareOptions.CultureInvariantIgnoreCase);
else i += 5; // Length of "email"
if(i == -1) throw new Exception("You should select the email field when exporting.");
else i += 6; // Length of "e-mail"
// Find the next delimeter.
string delim = null;
for(int k = i; k < line.Count; k++)
{
char c = line[k];
if(c == '\t' || c == ',')
{
delim = c.ToString();
break;
}
}
if(delim == null)
throw new Exception("Unrecognised file format.");
Кроме того, вы сказали, что будут проблемы с полями имени и фамилии, а также с такими вещами, как электронная почта и электронная почта. Вам понадобится довольно хороший шаблон дизайна здесь. В истинных интересах нормализованных данных я буду хранить имя и фамилию (и объединять их в пользовательском интерфейсе). Таким образом:
interface IField
{
string[] Accepts { get; } // Gets the fields that this can accept.
string[] Gives { get; } // Gets the field that this would give.
IEnumerable<KeyValuePair<string, string>> Handle(IEnumerable<KeyValuePair<string, string>> fields);
}
class NameField
{
string[] Accepts { get return new string[] { "FirstName", "LastName", "Name", "First Name", etc. }; }
string[] Gives { get return new string[] { "FirstName", "LastName" }; }
IEnumerable<KeyValuePair<string, string>> Handle(IEnumerable<KeyValuePair<string, string>> fields)
{
string firstName = null, lastName = null;
foreach(KeyValuePair<string, string> field in fields)
{
switch(field.Key)
{
case "FirstName":
case "First Name":
firstName = field.Value;
break;
// ...
case "FullName":
case "Full Name":
// Split into fn and ln.
break;
// ...
}
}
yield return new KeyValuePair<string, string>("FirstName", firstName);
yield return new KeyValuePair<string, string>("LastName", lastName);
}
}
В любом случае, я уверен, что вы поняли идею. Группа преобразований, которые превратят поля в распознанные.