我有一种方法可以做到这一点,如下所示,但我真的想看看是否有一种更干净的方法可以在不使用 CSV 库或包的情况下做到这一点。
public static void Read(string FilePath, DataTable dataTable)
{
dataTable.Rows.Clear();
StreamReader streamReader = new StreamReader(FilePath);
string[] Headers = streamReader.ReadLine().Split(',');
while (!streamReader.EndOfStream)
{
string[] filefields = Regex.Split(streamReader.ReadLine(), ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
DataRow dataRow = dataTable.NewRow();
for (int i = 0; i < Headers.Length; i++)
{
switch (Type.GetTypeCode(dataTable.Columns[i].DataType))
{
case TypeCode.Boolean:
dataRow[i] = Boolean.Parse(filefields[i]); break;
case TypeCode.Byte:
dataRow[i] = Byte.Parse(filefields[i]); break;
case TypeCode.Char:
dataRow[i] = Char.Parse(filefields[i]);break;
case TypeCode.DateTime:
dataRow[i] = DateTime.Parse(filefields[i]); break;
case TypeCode.Decimal:
dataRow[i] = Decimal.Parse(filefields[i]); break;
case TypeCode.Double:
dataRow[i] = Double.Parse(filefields[i]); break;
case TypeCode.Int16:
dataRow[i] = Int16.Parse(filefields[i]); break;
case TypeCode.Int32:
dataRow[i] = Int32.Parse(filefields[i]); break;
case TypeCode.Int64:
dataRow[i] = Int64.Parse(filefields[i]); break;
case TypeCode.Object:
dataRow[i] = (object)filefields[i]; break;
case TypeCode.SByte:
dataRow[i] = SByte.Parse(filefields[i]); break;
case TypeCode.Single:
dataRow[i] = Single.Parse(filefields[i]); break;
case TypeCode.String:
dataRow[i] = filefields[i].ToString(); break;
case TypeCode.UInt16:
dataRow[i] = UInt16.Parse(filefields[i]);break;
case TypeCode.UInt32:
dataRow[i] = UInt32.Parse(filefields[i]);break;
case TypeCode.UInt64:
dataRow[i] = UInt64.Parse(filefields[i]); break;
default: break;
}
}
}
}
这可行,但随着大量数据的出现,开关盒会变得昂贵。
我实际上找到了解决方案。使用convert.changetype()。请参阅下面的代码。
public static void Read(string FilePath, DataTable dataTable)
{
dataTable.Rows.Clear();
StreamReader streamReader = new StreamReader(FilePath);
string[] Headers = streamReader.ReadLine().Split(',');
while (!streamReader.EndOfStream)
{
string[] filefields = Regex.Split(streamReader.ReadLine(), ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
DataRow dataRow = dataTable.NewRow();
for (int i = 0; i < Headers.Length; i++)
{
DataColumn column = dataTable.Columns[i];
object parsedvalue = Convert.ChangeType(filefields[i], column.DataType);
dataRow[i] = parsedvalue;
}
}
}