2012-06-28 44 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());` 
    } 

最終的結果是一致的格式都是進口的所有記錄...