如何使用 C# 删除 .CSV 文件中的第一个字段和该字段的所有值
how to delete first field and all values of this field in .CSV file using C#
我想加载 .csv 文件,然后导入到 SQl 数据库。但在此之前,我想删除第一个字段(在 header 中)以及该字段的所有值。
下面是我的 .csv 文件的示例:
> TableId|PERIODE|DATEBALANCEASOF|ACCCODE|CUSTNAME|CUSTGROUP|
> TB_001|201501|2015-01-01|11-0001|DYNAMIC EXPRESS|11|
> TB_001|201501|2015-01-01|11-0002|DYNAMIC EXPRESS|12|
> TB_001|201501|2015-01-01|11-0003|DYNAMIC EXPRESS|13|
> TB_001|201501|2015-01-01|11-0004|DYNAMIC EXPRESS|14|
在导入 .csv 文件之前,我需要如下所示的 .csv 文件:
PERIODE|DATEBALANCEASOF|ACCCODE|CUSTNAME|CUSTGROUP|
201501|2015-01-01|11-0001|DYNAMIC EXPRESS|11|
201501|2015-01-01|11-0002|DYNAMIC EXPRESS|12|
201501|2015-01-01|11-0003|DYNAMIC EXPRESS|13|
201501|2015-01-01|11-0004|DYNAMIC EXPRESS|14|
下面是我的代码:
public void readCSVManual(string pathLocalSuccess, string pathHistory, string modul)
{
try
{
SqlConnection con = new SqlConnection();
con.ConnectionString = @"server=" + serverDB + "; database=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
string[] files = Directory.GetFiles(pathLocalSuccess);
if (files == null)
{
MessageBox.Show("Files not found");
}
foreach (string file in files)
{
FileInfo fileInf = new FileInfo(file);
string filename = fileInf.Name;
StreamReader reader = new StreamReader(file);
string line = reader.ReadLine();
string[] value = line.Split('|');
var list = new List<string>(value);
list.RemoveAt(0);
value = list.ToArray();
//string[] v = string(nValue.ToArray());
DataTable dt = new DataTable();
DataRow row;
foreach (string dc in value)
{
dt.Columns.Add(new DataColumn(dc));
}
while (!reader.EndOfStream)
{
value = reader.ReadLine().Split('|');
if (value.Length == dt.Columns.Count)
{
row = dt.NewRow();
row.ItemArray = value;
dt.Rows.Add(row);
}
}
SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = "ACC_004";
bc.BatchSize = dt.Rows.Count;
bc.WriteToServer(dt);
bc.Close();
con.Close();
reader.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
请帮我解决这个问题..
感谢所有回答我问题的人,
实际上我已经通过在我的代码中进行一些编辑来解决这个问题
下面是我的代码,对我有用:
public void readCSVAutomatic(string pathLocalSuccess, string pathHistory, string pathLogFolderSuccess, string pathErrorLog, string modul)
{
try
{
string[] files = Directory.GetFiles(pathLocalSuccess);
foreach (string file in files)
{
FileInfo fileInf = new FileInfo(file);
string filename = fileInf.Name;
StreamReader reader = new StreamReader(file);
string line = reader.ReadLine();
string[] value = line.Split('|');
DataTable dt = new DataTable();
DataRow row;
foreach (string dc in value)
{
dt.Columns.Add(new DataColumn(dc));
}
while (!reader.EndOfStream)
{
//value = value.
value = reader.ReadLine().Split('|');
if (value.Length == dt.Columns.Count)
{
row = dt.NewRow();
row.ItemArray = value;
dt.Rows.Add(row);
}
}
string xTableName = dt.Rows[0].ItemArray[0].ToString();
string xPeriode = dt.Rows[0].ItemArray[1].ToString();
dt.Columns.RemoveAt(0);
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=" + serverDB + "; Initial Catalog=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
con.Open();
SqlCommand com = con.CreateCommand();
string strDelete = "DELETE FROM " + xTableName + " WHERE PERIODE='" + xPeriode + "'";
com.CommandText = strDelete;
com.Connection = con;
com.ExecuteNonQuery();
SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = xTableName;
bc.BatchSize = dt.Rows.Count;
bc.WriteToServer(dt);
bc.Close();
con.Close();
reader.Close();
moveFileAfterImported(pathLocalSuccess, filename, pathHistory);
createLogCSVSuccessImported(pathLogFolderSuccess, "File Imported","Message");
}
}
catch(Exception ex)
{
createErrorLogImportCSV(pathErrorLog, "ErrorImportCSV", ex.ToString());
}
}
这似乎适合我:
首先从阅读所有文件开始:
var datatables =
Directory
.GetFiles(pathLocalSuccess)
.Select(file => File.ReadAllLines(file).Select(x => x.Split('|')).ToArray())
.Select(lines => new
{
headers = lines[0].Skip(1).ToArray(),
lines = lines.Skip(1).Select(l => l.Skip(1).ToArray()).ToArray(),
})
.Select(x =>
{
var dt = new DataTable();
foreach (var dc in x.headers)
{
dt.Columns.Add(new DataColumn(dc));
}
foreach (var line in x.lines.Skip(1).Where(y => y.Length == x.headers.Length))
{
var row = dt.NewRow();
row.ItemArray = line;
dt.Rows.Add(row);
}
return dt;
})
.ToArray();
那么加载所有数据就是一件简单的事情。此代码仅打开一次连接。应该挺快的。
if (!datatables.Any())
{
MessageBox.Show("Files not found");
}
else
{
using (var con = new SqlConnection())
{
con.ConnectionString = @"server=" + serverDB + "; database=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
foreach (var dt in datatables)
{
var bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = "ACC_004";
bc.BatchSize = dt.Rows.Count;
bc.WriteToServer(dt);
bc.Close();
}
con.Close();
}
}
跳过第一个字段的重要部分在这段代码中找到:
.Select(lines => new
{
headers = lines[0].Skip(1).ToArray(),
lines = lines.Skip(1).Select(l => l.Skip(1).ToArray()).ToArray(),
})
我想加载 .csv 文件,然后导入到 SQl 数据库。但在此之前,我想删除第一个字段(在 header 中)以及该字段的所有值。
下面是我的 .csv 文件的示例:
> TableId|PERIODE|DATEBALANCEASOF|ACCCODE|CUSTNAME|CUSTGROUP|
> TB_001|201501|2015-01-01|11-0001|DYNAMIC EXPRESS|11|
> TB_001|201501|2015-01-01|11-0002|DYNAMIC EXPRESS|12|
> TB_001|201501|2015-01-01|11-0003|DYNAMIC EXPRESS|13|
> TB_001|201501|2015-01-01|11-0004|DYNAMIC EXPRESS|14|
在导入 .csv 文件之前,我需要如下所示的 .csv 文件:
PERIODE|DATEBALANCEASOF|ACCCODE|CUSTNAME|CUSTGROUP|
201501|2015-01-01|11-0001|DYNAMIC EXPRESS|11|
201501|2015-01-01|11-0002|DYNAMIC EXPRESS|12|
201501|2015-01-01|11-0003|DYNAMIC EXPRESS|13|
201501|2015-01-01|11-0004|DYNAMIC EXPRESS|14|
下面是我的代码:
public void readCSVManual(string pathLocalSuccess, string pathHistory, string modul)
{
try
{
SqlConnection con = new SqlConnection();
con.ConnectionString = @"server=" + serverDB + "; database=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
string[] files = Directory.GetFiles(pathLocalSuccess);
if (files == null)
{
MessageBox.Show("Files not found");
}
foreach (string file in files)
{
FileInfo fileInf = new FileInfo(file);
string filename = fileInf.Name;
StreamReader reader = new StreamReader(file);
string line = reader.ReadLine();
string[] value = line.Split('|');
var list = new List<string>(value);
list.RemoveAt(0);
value = list.ToArray();
//string[] v = string(nValue.ToArray());
DataTable dt = new DataTable();
DataRow row;
foreach (string dc in value)
{
dt.Columns.Add(new DataColumn(dc));
}
while (!reader.EndOfStream)
{
value = reader.ReadLine().Split('|');
if (value.Length == dt.Columns.Count)
{
row = dt.NewRow();
row.ItemArray = value;
dt.Rows.Add(row);
}
}
SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = "ACC_004";
bc.BatchSize = dt.Rows.Count;
bc.WriteToServer(dt);
bc.Close();
con.Close();
reader.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
请帮我解决这个问题..
感谢所有回答我问题的人, 实际上我已经通过在我的代码中进行一些编辑来解决这个问题 下面是我的代码,对我有用:
public void readCSVAutomatic(string pathLocalSuccess, string pathHistory, string pathLogFolderSuccess, string pathErrorLog, string modul)
{
try
{
string[] files = Directory.GetFiles(pathLocalSuccess);
foreach (string file in files)
{
FileInfo fileInf = new FileInfo(file);
string filename = fileInf.Name;
StreamReader reader = new StreamReader(file);
string line = reader.ReadLine();
string[] value = line.Split('|');
DataTable dt = new DataTable();
DataRow row;
foreach (string dc in value)
{
dt.Columns.Add(new DataColumn(dc));
}
while (!reader.EndOfStream)
{
//value = value.
value = reader.ReadLine().Split('|');
if (value.Length == dt.Columns.Count)
{
row = dt.NewRow();
row.ItemArray = value;
dt.Rows.Add(row);
}
}
string xTableName = dt.Rows[0].ItemArray[0].ToString();
string xPeriode = dt.Rows[0].ItemArray[1].ToString();
dt.Columns.RemoveAt(0);
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=" + serverDB + "; Initial Catalog=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
con.Open();
SqlCommand com = con.CreateCommand();
string strDelete = "DELETE FROM " + xTableName + " WHERE PERIODE='" + xPeriode + "'";
com.CommandText = strDelete;
com.Connection = con;
com.ExecuteNonQuery();
SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = xTableName;
bc.BatchSize = dt.Rows.Count;
bc.WriteToServer(dt);
bc.Close();
con.Close();
reader.Close();
moveFileAfterImported(pathLocalSuccess, filename, pathHistory);
createLogCSVSuccessImported(pathLogFolderSuccess, "File Imported","Message");
}
}
catch(Exception ex)
{
createErrorLogImportCSV(pathErrorLog, "ErrorImportCSV", ex.ToString());
}
}
这似乎适合我:
首先从阅读所有文件开始:
var datatables =
Directory
.GetFiles(pathLocalSuccess)
.Select(file => File.ReadAllLines(file).Select(x => x.Split('|')).ToArray())
.Select(lines => new
{
headers = lines[0].Skip(1).ToArray(),
lines = lines.Skip(1).Select(l => l.Skip(1).ToArray()).ToArray(),
})
.Select(x =>
{
var dt = new DataTable();
foreach (var dc in x.headers)
{
dt.Columns.Add(new DataColumn(dc));
}
foreach (var line in x.lines.Skip(1).Where(y => y.Length == x.headers.Length))
{
var row = dt.NewRow();
row.ItemArray = line;
dt.Rows.Add(row);
}
return dt;
})
.ToArray();
那么加载所有数据就是一件简单的事情。此代码仅打开一次连接。应该挺快的。
if (!datatables.Any())
{
MessageBox.Show("Files not found");
}
else
{
using (var con = new SqlConnection())
{
con.ConnectionString = @"server=" + serverDB + "; database=" + DB + "; Trusted_Connection=" + trustedConnection + "; user=" + UserDB + "; password=" + PassDB + "";
foreach (var dt in datatables)
{
var bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = "ACC_004";
bc.BatchSize = dt.Rows.Count;
bc.WriteToServer(dt);
bc.Close();
}
con.Close();
}
}
跳过第一个字段的重要部分在这段代码中找到:
.Select(lines => new
{
headers = lines[0].Skip(1).ToArray(),
lines = lines.Skip(1).Select(l => l.Skip(1).ToArray()).ToArray(),
})