पिछले उत्तरों को पूरा करने के लिए, किसी को अपनी CSV फ़ाइल से वस्तुओं के संग्रह की आवश्यकता हो सकती है, या तो विधि TextFieldParser
या string.Split
विधि द्वारा पार्स किया गया है , और फिर प्रत्येक रेखा परावर्तन के माध्यम से किसी वस्तु में परिवर्तित हो जाती है। आपको स्पष्ट रूप से पहले एक वर्ग को परिभाषित करने की आवश्यकता है जो सीएसवी फ़ाइल की रेखाओं से मेल खाता है।
मैंने माइकल क्रॉपट से सरल CSV सीरियल का उपयोग किया, जो यहां पाया गया: CSV को जेनेरिक वर्ग (सभी गुण)
और कामना वर्ग के क्षेत्र और गुण प्राप्त करने के लिए अपने तरीकों का पुन: उपयोग किया।
मैं अपनी CSV फ़ाइल को निम्न विधि से डिस्क्राइबलाइज़ करता हूँ:
public static IEnumerable<T> ReadCsvFileTextFieldParser<T>(string fileFullPath, string delimiter = ";") where T : new()
{
if (!File.Exists(fileFullPath))
{
return null;
}
var list = new List<T>();
var csvFields = GetAllFieldOfClass<T>();
var fieldDict = new Dictionary<int, MemberInfo>();
using (TextFieldParser parser = new TextFieldParser(fileFullPath))
{
parser.SetDelimiters(delimiter);
bool headerParsed = false;
while (!parser.EndOfData)
{
//Processing row
string[] rowFields = parser.ReadFields();
if (!headerParsed)
{
for (int i = 0; i < rowFields.Length; i++)
{
// First row shall be the header!
var csvField = csvFields.Where(f => f.Name == rowFields[i]).FirstOrDefault();
if (csvField != null)
{
fieldDict.Add(i, csvField);
}
}
headerParsed = true;
}
else
{
T newObj = new T();
for (int i = 0; i < rowFields.Length; i++)
{
var csvFied = fieldDict[i];
var record = rowFields[i];
if (csvFied is FieldInfo)
{
((FieldInfo)csvFied).SetValue(newObj, record);
}
else if (csvFied is PropertyInfo)
{
var pi = (PropertyInfo)csvFied;
pi.SetValue(newObj, Convert.ChangeType(record, pi.PropertyType), null);
}
else
{
throw new Exception("Unhandled case.");
}
}
if (newObj != null)
{
list.Add(newObj);
}
}
}
}
return list;
}
public static IEnumerable<MemberInfo> GetAllFieldOfClass<T>()
{
return
from mi in typeof(T).GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)
where new[] { MemberTypes.Field, MemberTypes.Property }.Contains(mi.MemberType)
let orderAttr = (ColumnOrderAttribute)Attribute.GetCustomAttribute(mi, typeof(ColumnOrderAttribute))
orderby orderAttr == null ? int.MaxValue : orderAttr.Order, mi.Name
select mi;
}