【问题标题】:Read Data From Text File and Insert To databse从文本文件中读取数据并插入数据库
【发布时间】:2013-12-06 07:32:39
【问题描述】:

我想逐行从文本文件中读取数据,并将数据插入到数据库的每一行中。

我现在正在考虑的内容是逐行读取并在每一行插入数据库。我在这里问的是有更好的主意吗?就像我们可以做些什么来一次插入数据而不是逐行循环并插入记录?我每天需要存储的文本文件中有大约 500 多行,所以性能是我的问题。

请注意,我需要将每一行作为一行插入数据库中。数据由逗号分隔,因此我需要将它们拆分并将它们插入特定列。

有什么推荐吗?

【问题讨论】:

    标签: asp.net vb.net sql-server-2008 sql-insert


    【解决方案1】:
    Imports System
    Imports System.IO
    Imports System.Collections
    
    Module Module1
    
        Sub Main()
            Dim objReader As New StreamReader("c:\test.txt")
            Dim sLine As String = ""
            Dim arrText As New ArrayList()
    
            Do
                sLine = objReader.ReadLine()
                If Not sLine Is Nothing Then
                    arrText.Add(sLine)
                End If
            Loop Until sLine Is Nothing
    
    
            objReader.Close()
           Using command As New SqlCeCommand("INSERT INTO table(col1) VALUES(@data1)", Con)
           command.Parameters.AddWithValue("@data1", "")           
      For Each sLine In arrText
                    command.Parameters("@data1").Value = sLine
                    command.ExecuteNonQuery()
                Next
    
           End Using
        End Sub
    End Module
    

    【讨论】:

      【解决方案2】:

      您可以先将文本文件放入数据表(放入数据表不会有任何性能问题,因为它是基于内存的,并且没有到服务器的循环行程),然后使用 Bulkcopy 功能将其插入数据库。我假设数据将被插入到 SQL Server 数据库中。您可以使用 SQLBulkCopy,这里是示例代码:

      private void BulkInsert()
      {
          SqlBulkCopy bulkCopy = new SqlBulkCopy("Server=ServerName;Database=test;Trusted_Connection=True;", 
          SqlBulkCopyOptions.TableLock);
          bulkCopy.DestinationTableName = "target_table";
          bulkCopy.WriteToServer(Text2Table());
      }
      
      private DataTable Text2Table()
      {
          DataTable dt = new DataTable();
      
          StreamReader sr = new StreamReader(@"c:\test\test.txt");
          string input;
      
          while ((inrecord = sr.ReadLine()) != null)
          {
              string[] values = inrecord.Split(new char[] { '|' });
              dr = dt.NewRow();
              dr["column1"] = values[0];
              dr["column2"] = values[1];
              dr["column3"] = values[2];
              dr["column4"] = values[3];
              dt.Rows.Add(dr);
          }
          sr.Close();
          return dt;
      }
      

      【讨论】:

        【解决方案3】:

        我认为这并不难,它很容易。

        导入 java.io.File;
        导入 java.io.FileNotFoundException;

        导入 java.util.Scanner;

        public class ScannerReadFile {
        
            public static void main(String[] args) {
        
        FileInputStream fstream = new FileInputStream("textfile.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        
        String strLine;
        int row =0;
        int col;
        
        while ((strLine = br.readLine()) != null)   {
        
               Scanner scanner = new Scanner(strLine);
               String token="";
               while(scanner.hasNext()){
                token = scanner.next();
                for(int i = 0; i<token.length();i++){
        
                    if(token.charAt(i)!=','){
                        record += token.charAt(i);
                    }
                    else{
                    insert into table values ( record )  
                    record = "";
                    }
                }
                  row++;       
               } }
        

        【讨论】:

        • 如果我想逐行读取并逐条插入记录,这不是 vb.net 的第二个问题,因为我在 txt 文件中有 500 多行数据。
        • 谢谢你的负面观点,第二,我没有读到你不是java程序员,第三,我可以轻松做到并不难,但是在java中,。我以前做过这个
        【解决方案4】:

        性能问题是由于正常插入到 DB 而不是因为读取文件。

        为了解决这个问题,我建议您使用强类型数据表 - 因为您只进行插入,只需向此 .Net 数据表添加新行,最后一次性将其提交到 DB(使用 SqlDataAdapter)

        关于读取文件,我建议你使用现有的 vb.net 库:Microsoft.VisualBasic.FileIo.TextFiledParser (ref:http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(v=vs.110).aspx)。

        当然,你还有另一种选择,而不是使用 DataTable,生成纯文本 SQL 插入查询会执行得更好,输出查询会是这样的:

        INSERT INTO tblTarget(Id, Col1, Col2)
        Values (1, 'Row1.Val1', 'Row1.Val2'),
               (2, 'Row2.Val1', 'Row2.Val2'),
               (3, 'Row3.Val1', 'Row3.Val2'),
               (4, 'Row4.Val1', 'Row4.Val2'),
               ...
        

        希望对你有帮助...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-15
          • 2019-05-17
          • 1970-01-01
          • 2019-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多