[英]import text file(500 MB) data into SQL Server
這是我用於將大於500 MB的文本文件導入數據庫的代碼。
我想分批處理,以便在執行過程中如果文本文件中發生任何與格式相關的錯誤,至少要上傳一半內容。
如果有其他建議要上傳這么大的文本文件,請指定。
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;
}
如果文件將被完全處理,則可以向后處理它,並在處理完每條記錄后將其截斷,這樣,您始終可以處理整個文件,並在處理行時釋放行的磁盤空間。 從錯誤恢復后,您可以“安全地”讀取整個文件。
首先,您必須聲明一個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.
您還可以累積讀取的行的大小,並在出現錯誤或操作完成后截斷文件
最簡單的方法是創建文本文件行,將它們分塊包裝-假設有100行。 在ReadLine while循環中進行組織。
您是在說文本文件,對。 因為您的代碼具有fileuploadexcel ...
無論如何-如果是文字,到目前為止,最簡單的方法是使用http://www.filehelpers.com
它支持固定和定界格式,並且快速且易於使用。
它具有多種錯誤模式,其中一種允許您執行此操作
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());`
}
最終結果是所有與格式匹配的記錄都被導入...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.