[英]How to split string data and push to data table with specific format using asp.net c#?
也许这是糟糕的一天,或者我是个傻瓜。 我试图从文件上传 (.txt) 创建数据表。
10|00309|IN3136|EKM|110|13-12-2019|V1.1|||||
20|1|01|02|13122019120157_1||请输入母亲的名字|
20|2|01|02|13122019120157_2||请输入母亲的名字|
20|3|01|02|13122019120157_3||请输入母亲的名字|
是文本文件中的数据。
var data = File.ReadAllText(FilePath);
string[] strArr = null;
int count = 0;
char[] splitchar = { '|' };
strArr = data.Split(splitchar);
DataTable dt2 = new DataTable();
dt2.Clear();
dt2.Columns.Add("Col0");
dt2.Columns.Add("Col1");
dt2.Columns.Add("Col2");
dt2.Columns.Add("Col3");
dt2.Columns.Add("Col4");
dt2.Columns.Add("Col5");
dt2.Columns.Add("Col6");
for (count = 0; count <= strArr.Length - 1; count++)
{
if (count >= 11)
{
DataRow _dr2 = dt2.NewRow();
for (int i = 0; i <= 6; i++)
{
if (i == 0)
_dr2["Col0"] = strArr[count+i];
else if (i == 1)
_dr2["Col1"] = strArr[count+i];
else if (i == 2)
_dr2["Col2"] = strArr[count+i];
else if (i == 3)
_dr2["Col3"] = strArr[count+i];
else if (i == 4)
_dr2["Col4"] = strArr[count+i];
else if (i == 5)
_dr2["Col5"] = strArr[count+i];
else if (i == 6)
_dr2["Col6"] = strArr[count+i];
}
dt2.Rows.Add(_dr2);
}
}
我正在努力让它像这样
我的循环完全是愚蠢的,我知道,请指出我正确的方向..
这本质上是一个 CSV 文件,使用|
作为字段分隔符。 您可以使用带有自定义字段分隔符的CsvHelper 之类的库,而不是编写自己的代码。 您甚至可以将字符串值直接解析为数字或日期。
CsvHelper提供CsvReader读取单个字段或完整记录, CsvDataReader加载CSV文件作为IDataReader
,可以用来加载一个DataTable或使用数据导入到数据库中如使用SqlBulkCopy
借用文档示例:
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader))
{
// Do any configuration to `CsvReader` before creating CsvDataReader.
csv.Configuration.Delimiter="|";
using (var dr = new CsvDataReader(csv))
{
var dt = new DataTable();
dt.Load(dr);
}
}
而不是使用File.ReadAllText
,使用File.ReadAllLines
,它很容易在所有行之间遍历,因为每行是一个记录。
var lines = File.ReadAllLines(**@Path to the File**);
for (int i = 0; i < lines.Length; i++)
{
var str = lines[i];
var strarray = str.Split('|');
}
下面的代码会给你预期的结果:数据表填充了来自 CSV 文件的行。
DataTable dt2 = new DataTable();
dt2.Columns.Add("Col0");
dt2.Columns.Add("Col1");
dt2.Columns.Add("Col2");
dt2.Columns.Add("Col3");
dt2.Columns.Add("Col4");
dt2.Columns.Add("Col5");
dt2.Columns.Add("Col6");
var lines = File.ReadAllLines(@"file path"); //C:\ToBeDeleted\test.txt
for (int i = 0; i < lines.Length; i++)
{
var str = lines[i];
var strarray = str.Split('|');
DataRow drow = dt2.NewRow();
drow["Col0"] = strarray[0];
drow["Col1"] = strarray[1];
drow["Col2"] = strarray[2];
drow["Col3"] = strarray[3];
drow["Col4"] = strarray[4];
drow["Col5"] = strarray[5];
drow["Col6"] = strarray[6];
dt2.Rows.Add(drow);
}
要显示您的预期结果,请使用以下控制台代码:
//Displaying as a table.
for (int i = 0; i < dt2.Columns.Count; i++)
{
Console.Write(dt2.Columns[i].ColumnName + " \t |");
}
Console.WriteLine();
for (int j = 0; j < dt2.Rows.Count; j++)
{
for (int i = 0; i < dt2.Columns.Count; i++)
{
Console.Write(dt2.Rows[j].ItemArray[i] + " \t | ");
}
Console.WriteLine();
}
下面是上面代码的输出。
最后,我最终做到了这一点。 它对我有用(至少现在:D)
private DataTable ConvertToDataTable(string FilePath)
{
var lines = File.ReadAllLines(FilePath);
DataTable dt2 = new DataTable();
dt2.Clear();
dt2.Columns.Add("Col0");
dt2.Columns.Add("Col1");
dt2.Columns.Add("Col2");
dt2.Columns.Add("Col3");
dt2.Columns.Add("Col4");
dt2.Columns.Add("Col5");
dt2.Columns.Add("Col6");
for (int i = 0; i < lines.Length; i++)
{
var str = lines[i];
if (i > 0)
{
var strarray = str.Split('|');
DataRow _dr2 = dt2.NewRow();
for (int count = 0; count <= strarray.Length - 1; count++)
{
if (count == 0)
_dr2["Col0"] = strarray[count];
else if (count == 1)
_dr2["Col1"] = strarray[count];
else if (count == 2)
_dr2["Col2"] = strarray[count];
else if (count == 3)
_dr2["Col3"] = strarray[count];
else if (count == 4)
_dr2["Col4"] = strarray[count];
else if (count == 5)
_dr2["Col5"] = strarray[count];
else if (count == 6)
_dr2["Col6"] = strarray[count];
}
dt2.Rows.Add(_dr2);
}
}
return dt2;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.