我想将 csv 文件中的数据列数据类型读入 .NET 数据表

问题描述 投票:0回答:1

我有一种方法可以做到这一点,如下所示,但我真的想看看是否有一种更干净的方法可以在不使用 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;
                        }
                    }
                }
            }

这可行,但随着大量数据的出现,开关盒会变得昂贵。

c# csv datatable code-cleanup
1个回答
0
投票

我实际上找到了解决方案。使用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;
                    }
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.