C# 读取TXT数据并处理

时间:2022-11-06 11:37:31

处理TXT中的数据规则

场景:

如下图所示,在验证“提示:输入”后面的E开头的数据是将被处理的数据之后,将“提示”下面的同名称的英文别名的第一列的数据作处理,只取一个最大值与一个最小值,然后绑定到前端页面中。

C# 读取TXT数据并处理
.
.
.

C# 读取TXT数据并处理

思路:

  1. 读取完整个txt的数据后,先对每个内容块[begin-end]的第一行是否是begin做判断。
  2. 接着判断“输入”后面的号码是不是要进行数据处理的号码。
  3. 然后将这个号码所属的内容块导入一个临时表Tab1中,内置两列,内容块的别名以及第一列的数据。
  4. 对Tab1进行处理,声明两个list,一个存放遍历Tab1过的别名nameList,一个存放相同别名的数据valueList,用表自身别名遍历这个Tab1,每遍历完一个别名,对这个别名中的valueList数据进行排序,取其中一个最大与最小值,并将其别名与两个值放置在Tab2中,然后将这个别名存放在nameList中,用于判断下一个别名是不是相同的,是否被遍历过。
    (考虑:是否可以将Tab2中别名作为遍历记录的参照物?)

  5. 将Tab2中的别名更改为符合数据库规则的名称,这里参照了一个规则名称对应表。

  6. 更完名之后,对应要传值到页面的表格Tab3(内含其他的内容)的名称,将最大值与最小值传入这个Tab3中的特定地方,绑定Tab3到页面中。

代码:

//datacollection为读取完txt内容的string[]数组
for (int everyindex = 0; everyindex < datacollection.Length; everyindex++)
{
    //当内容块的第一行为begin时,开始对内容块进行处理
    if (datacollection[everyindex].Trim().Contains("BEGIN"))
    {
        //当读取到号码时,判断txt文件中的号码是否是要处理的
        if ((datacollection[everyindex+1].Trim()).Contains(runmdno))
        {
            //第一步:将内容块别名、第一列数据转移到Tab1中
            #dealTal1

            //第二步:从Tab1中经过处理,获取最小最大值,放入Tab2中
            #getValueToTab2

            //第三步:更换Tab2的别名
            #changeTab2Name

            //第四步:将对应名字的值传递到页面的表格Tab3中,绑定页面
            #dealTab3
        }
    }
}
//遍历完所有的内容块之后,将页面表Tab3绑定到页面中
this.grdv_Record.DataSource = Tab3;
this.grdv_Record.DataBind();

第一步:’#’dealTal1(将内容块别名、第一列数据转移到Tab1中)

//开始循环读取txt别名以及数据,以及实现txt数据转移到临时表tab1中
for (int temp = everyindex+1; temp < datacollection.Length; temp++)
{
    DataRow txtRow = Tab1.NewRow();

    //txt文件中每一个tab都是一个'/t',因此要切分他们
    tempsplits = datacollection[temp].Trim().Split(new char[] { '\t', '"' },     StringSplitOptions.RemoveEmptyEntries);

    //直到读取end时,内容块结束循环
    if (tempsplits.Length > 1 && !datacollection[temp].Trim().Contains("END"))
    {
        if (!datacollection[temp].Trim().Contains("提示"))
        {
          //将txt文档中的每一行数据都放到一个getDataFromTxtTab的表格中
          txtRow["txtName"] = tempsplits[0].Trim();
          txtRow["txtValue"] = tempsplits[1].Trim();
          Tab1.Rows.Add(txtRow);
        }
        else
        {
            continue;
        }
    }
    else
    {
        //用当前循环的位置替代外层循环的位置
        everyindex = temp;
        break;
    }
}

第二步:’#’getValueToTab2(从Tab1中经过处理,获取最小最大值,放入Tab2中)

//数组,用于记录要筛选最大值与最小值的数据和处理过的数据名称
List<string> txtNameList = new List<string>();

for (int tab1Num = 0; tab1Num < Tab1.Rows.Count; tab1Num ++)
{
  DataRow deliverRow = Tab2.NewRow();
  List<double> txtValueList = new List<double>();

  //将临时表的每一个项目名字遍历一遍表本身,获取该项目名字的所有测量数据
  string txtName1 = Tab1.Rows[tab1Num]["txtName"].ToString().Trim();
  bool isExit = false; 

  //该循环用于判断该项目名称是否在list中存在,存在则是被处理过的数据
  for (int listNum = 0; listNum < txtNameList.Count; listNum++)
  {
    if (txtName1 != txtNameList[listNum])
    {
      continue;
    }
    else
    {
      isExit = true;
      break;
    }
  }

  if (!isExit)
  {
    for (int txtNum = tab1Num ; txtNum < Tab1.Rows.Count; txtNum++)
    {
      string txtName2 = Tab1.Rows[txtNum]["txtName"].ToString().Trim();
      if (txtName1 == txtName2)
      {
        //将相同项目名称的数据放在list中
        txtValueList.Add(Convert.ToDouble(Tab1.Rows[txtNum]["txtValue"].ToString()));
      }
    }

    //将已经遍历过的项目名称记录在NameList当中
    txtNameList.Add(txtName1);
    deliverRow["txtName"] = txtName1;

    //获取同名字项目的最大最小值,并放置到传递表的相应的卷数中
    if (txtValueList.Count > 1)
    {
      //获取最大最小值的方法:#getMinNum()/#getMaxNum()
      deliverRow["minValue"] = getMinNum(txtValueList);
      deliverRow["maxValue"] = getMaxNum(txtValueList);
    }
    else
    {
      deliverRow["maxValue"] = txtValueList[0];
    }
    //获取的最大最小值放在tab2中
    Tab2.Rows.Add(deliverRow);
  }  
}

第三步:’#’changeTab2Name(更换Tab2的别名)

//更换传递表txt的英文项目名称为数据库中对应的itemno
for (int deliverNum = 0; deliverNum < deliverDataTab.Rows.Count; deliverNum++)
{
    //与数据库的名称对应表itemTxtTab
    for (int itemNum = 0; itemNum < itemTxtTab.Rows.Count; itemNum++)
    {       
        {
            Tab2.Rows[deliverNum]["items"] = itemTxtTab.Rows[itemNum]["items"].ToString();
            Tab2.Rows[deliverNum]["txtName"] = itemTxtTab.Rows[itemNum]["itemno"].ToString();
            break;
        }
    }
}

第四步:’#’dealTab3(将对应名字的值传递到页面的表格Tab3中,绑定页面)

for (int deliverNum = 0; deliverNum < Tab2.Rows.Count; deliverNum++)
{
    for (int pageNum = 0; pageNum < Tab3.Rows.Count; pageNum++)
    {
        string deliverName = Tab2.Rows[deliverNum]["txtName"].ToString().Trim();
        string pageName = Tab3.Rows[pageNum]["itemno"].ToString().Trim();
        string deliverItems = Tab2.Rows[deliverNum]["items"].ToString().Trim();
        string pageItems = Tab3.Rows[pageNum]["items"].ToString().Trim();

        //其他量度项的时候,通过对明项目名称items来判断是否与传递表的项目名称一致
        if (deliverName.Equals(pageName) || deliverItems.Equals(pageItems))
        {
            tab3.Rows[pageNum]["PminVal"] = tab2.Rows[deliverNum]["minValue"].ToString();
            tab3.Rows[pageNum]["PmaxVal"] = tab2.Rows[deliverNum]["maxValue"].ToString();
            break;
        }
    }
}

至此,就完成了对txt内容的解析。