繁体   English   中英

如何使用asp.net c#拆分字符串数据并推送到具有特定格式的数据表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM