在c#中使用大于255列的sql csv的有效方法?

gj3fmq9x  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(372)

我非常喜欢下面的oledb方法,因为我最终可以针对csv传递sql查询。
问题是oledb只能读取<256列,我还有更多。
有什么方法可以有效地查询c#中具有这种列大小的csv表?
我希望避免将整个csv带到一个datatable中,以便稍后使用linq。

DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
            {
                string header = isFirstRowHeader ? "Yes" : "No";

                string pathOnly = Path.GetDirectoryName(path);
                string fileName = Path.GetFileName(path);

                string sql = @"SELECT * FROM [" + fileName + "]";

                using (OleDbConnection connection = new OleDbConnection(
                          @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
                          ";Extended Properties=\"Text;HDR=" + header + "\""))
                using (OleDbCommand command = new OleDbCommand(sql, connection))
                using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                {
                    DataTable dataTable = new DataTable
                    {
                        Locale = CultureInfo.CurrentCulture
                    };
                    adapter.Fill(dataTable);
                    return dataTable;
                }
            }

更新:尝试在以下脚本的建议中添加注解以使用ace驱动程序,但以下oledb连接字符串仍然只能获得255列。仍在寻找实现这一目标的方法。

using (OleDbConnection connection = new OleDbConnection(
                      "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + pathOnly +"; Extended Properties =\"Text; HDR = Yes; FORMAT = Delimited\""))
aurhwmvo

aurhwmvo1#

像这样的怎么样

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
        {
            DataTable dataTable = null;

            using (var inStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (var sr = new StreamReader(inStream))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    var fields = line.Split(',');

                    if (dataTable == null) // create datatable based on header row
                    {
                        dataTable = new DataTable();
                        foreach (var field in fields)
                            dataTable.Columns.Add(new DataColumn(field));
                        continue; // don't add header row to rows collection
                    }

                    dataTable.Rows.Add(fields);
                }
            }

            return dataTable;
        }

如果您的第一行不是标题,则必须使用不同的方法来命名列。

相关问题