2012-06-28 47 views
1

这是我用于将大于500 MB的文本文件导入数据库的代码。将文本文件(500 MB)导入到SQL Server中

我想批量执行,以便在执行过程中如果文本文件中出现与格式相关的任何错误,至少会有一半内容上传。

如果有任何其他建议上传如此大的文本文件请指定。

private DataTable CreateDataTableFromFileLoop() 
{ 
    string filename = ""; 

    if (fileuploadExcel.HasFile) 
    { 
     try 
     { 
      filename = Path.GetFileName(fuTextLoop.FileName); 
      fuTextLoop.SaveAs(Server.MapPath("~/callText") + filename); 
      //StatusLabel.Text = "Upload status: File uploaded!"; 
     } 
     catch (Exception ex) 
     { 
      StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
     } 
    } 

    DataTable dt = new DataTable(); 
    DataColumn dc; 
    DataRow dr; 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Sr No"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Mobile"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Name"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Fath_Hus_Name"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Address"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "City"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "PIN Code"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Contact Number"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Activation_date"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Subs_type"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Status"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = System.Type.GetType("System.String"); 
    dc.ColumnName = "Subs_name"; 
    dc.Unique = false; 
    dt.Columns.Add(dc); 

    StreamReader sr = new StreamReader(Server.MapPath("~/callText") + filename); 

    SqlConnection conn = new SqlConnection("Server=.;Database=temp;Trusted_Connection=True;"); 

if (ddlSub.SelectedValue.ToString() == "Reliance") 
{ 
    try 
    { 
     string input; 
     string mob_chk; 

     while ((input = sr.ReadLine()) != null) 
     { 
      string[] s = input.Split(new char[] { ',' }); 

      dr = dt.NewRow(); 
      SqlCommand comm = new SqlCommand("select Mobile from call where Mobile='" + s[1] + "'", conn); 
      conn.Open(); 
      SqlDataReader sdr = comm.ExecuteReader(); 

      if (sdr.HasRows) 
      { 
       goto end_of_loop; 
      } 
      if (!sdr.HasRows) 
      { 
       dr["Sr No"] = s[0]; 
       dr["Mobile"] = s[1]; 
       dr["Name"] = s[3]; 
       dr["Fath_Hus_Name"] = s[4]+s[5]+s[6] + s[7]; 
       dr["Address"] = s[8]+s[9]; 
       dr["City"] = s[10]; 
       dr["PIN Code"] = s[11]; 
       dr["Contact Number"] = s[16]; 
       dr["Activation_date"] = s[18]; 
       dr["Subs_type"] = s[15]; 
       //dr["Status"] = s[10]; 
       dr["Subs_name"] = ddlSub.SelectedValue.ToString(); 
      } 

      dt.Rows.Add(dr); 
     end_of_loop: 
      conn.Close(); 
     } 

     sr.Close(); 

     dt.Rows[0].Delete(); 
    } 
    catch (Exception ex) 
    { 
      StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
    } 
} 

if (dt.Rows.Count > 0) 
{ 
    return dt; 
} 
else 
{ 
    return null; 
} 
+0

既然你知道文件的字段和格式,我建议你使用'class'而不是'table'。所以你会在最后列出一个名单 Boomer

回答

0

如果该文件将被完全处理,你可以为你处理它们向后处理它,并截断它的每个记录已被处理之后,这样你可以随时处理该行的整个文件和可用磁盘空间。当从错误中恢复时,您可以“安全地”读取整个文件。

首先你必须声明一个FileStream来跟踪文件,并传递到StreamReader的

FileStram fs = new FileStream(Server.MapPath("~/callText") + filename, FileMode.Open); 
StreamReader sr = new StreamReader(fs); 

现在你可以向后读取文件,直到\ n或\ r被发现然后是“sr.ReadLine”,但首先你需要文件的大小,所以你知道在完成这一行后它应该有多大。

long oldLen = fs.Length; 
fs.Seek(-2,SeekOrigin.End);//dont really begin from the end, because a line-end is very likely to be right there 
//here goes a simple while to read the file backwards until you find '\n' or '\r'. 
... 
//you should aso check for BOF 
fs.Seek(1,SeekOrigin.Current); //this is case that sr.Readline() gets confused with the line-end I just found 
//here you can input=sr.ReadLine() and all you have to do 
... 
... 

现在,您可以用旧尺寸减去刚刚读取的行的大小来截断它。

fs.SetLength(oldLen - Encoding.Unicode.GetByteCount(input));//replace Unicode with whatever encoding the file has. 

你也可以积累行的大小要阅读并截断该文件一旦那里有错误,或操作结束

0

最简单的方法是创建一个包装你的文本文件行块 - 让说100行。在ReadLine while循环中组织内部。

0

你说的是文本文件,没错。因为你的代码有fileuploadexcel ...

反正 - 如果它是文本,迄今为止最简单的方法是使用http://www.filehelpers.com

,支持固定和分隔格式,速度快,易于使用。

它有各种errormodes,他们中的一个可以让你做到这一点

engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue; 

records = engine.ReadFile(... 

if (engine.ErrorManager.HasErrors) 
    foreach (ErrorInfo err in engine.ErrorManager.Errors) 
    { 
     Console.WriteLine(err.LineNumber); 
     Console.WriteLine(err.RecordString); 
     Console.WriteLine(err.ExceptionInfo.ToString());` 
    } 

最终的结果是一致的格式都是进口的所有记录...