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

时间:2018-10-29 09:47:23

标签: c# sql-server sqlbulkcopy

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

我已经将行格式化为可操作的实体,但是我找不到将这个巨大的文件分解为多个DataTable以便与SQLBulkCopy一起使用的方法...

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

现代数据库和内存不足8M行。

您看过SSIS吗?将数据从CSV导入数据库非常容易。

如果您确实需要使用C#,则应该能够在C#中构建数据表,然后使用大容量复制来加载数据 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);

        }

答案 1 :(得分:0)

我为有同样问题的人们找到了解决方案。 只需读取每一行,然后将其添加到datable中,一旦DT达到批处理大小,我们就将其发送,然后为下一个批处理清除它,最后,即使datable不在批处理大小中,我们也会剩余剩余的内容:

            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);
                    }
                }