c# 将大型 ASCII 文件导入 sql-server 并将其分解

c# importing large ASCII file to sql-server and breaking it down

我目前的任务是将 800 万行从 ASCII 文件导入到 SQL 数据库。

我已经将行格式化为一个准备好进行操作的实体,但我找不到将这个巨大的文件分解成多个 DataTable 以与 SQLBulkCopy...

一起使用的方法

你们知道如何进行吗?我想使用这个解决方案 Process large file in chunks or not 但我不知道从哪里开始分解我的 1Go 文件...

感谢您的帮助。

8M 行对于现代数据库和内存来说并不多。

你看过SSIS吗?将数据从CSV导入DB真的很简单

如果您确实需要使用 C#,那么您应该能够在 C# 中构建数据 table,然后使用 Bulk Copy 加载数据 EG

DataTable newTable = new DataTable("Test");

// Add column objects to the table. 
DataColumn ID = new DataColumn();

ID.DataType = System.Type.GetType("System.Int32");
ID.ColumnName = "Col1";
newTable.Columns.Add(ID);

 foreach ( row in your source)               
 {


            DataRow row = newTable.NewRow();
            row["col1"] = modified.ToString();
            newTable.Rows.Add(row);



 }

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))            
        {
            bulkCopy.DestinationTableName = "dbo.test1";
            bulkCopy.WriteToServer(newTable);

        }

我为遇到同样问题的人找到了解决方案。 只需读取每一行,然后将其添加到数据表中,一旦 DT 达到批量大小,我们将发送它然后为下一批清除它,最后我们发送剩余的内容,即使数据表不是批量大小:

            using (FileStream stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))


            using (BufferedStream bufferedStream = new BufferedStream(stream))


            using (StreamReader streamReader = new StreamReader(bufferedStream))
            {
                string connectionString = @"connectionstring";
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();

                    while ((line = streamReader.ReadLine()) != null)
                    {
                        dfdfdf = line.Substring(42, 1);
                        fdfdf = line.Substring(45, 1);

                        DataRow row = dt.NewRow();
                        row["dfdfdf"] = dfdfdf;
                        row["fdfdf"] = fdfdf;

                        dt.Rows.Add(row);

                        if (dt.Rows.Count == batchSize)
                        {
                            try
                            {
                                Console.WriteLine("Batch sent");
                                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                                {
                            bulkCopy.ColumnMappings.Add("dfdfdf", "dfdfdf");
                            bulkCopy.ColumnMappings.Add("fdfdf", "fdfdf");

                                    bulkCopy.DestinationTableName = "table";
                                    bulkCopy.WriteToServer(dt);
                                }

                                dt.Clear();

                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }

                        }
                    }

                    try
                    {
                        Console.WriteLine("Last batch sent");
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                        {
                            bulkCopy.ColumnMappings.Add("dfdfdf", "dfdfdf");
                            bulkCopy.ColumnMappings.Add("fdfdf", "fdfdf");

                            bulkCopy.DestinationTableName = "table";
                            bulkCopy.WriteToServer(dt);
                        }

                        dt.Clear();

                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }