C#在多个数据后搜索文本文件,并将其填充到Datagrid视图中

C#在多个数据后搜索文本文件,并将其填充到Datagrid视图中,c#,C#,我从文本文件中获取数据。文件本身已经被ReadAllLines插入并转换为字符串-这对我来说很好,我用MessageBox检查了内容 文本文件如下所示(大约千行中只有一行): 现在这是2条记录,我需要每条记录中的2个数据 “XY编号”-这些是“16XY”之后的前16位数字(16XY始终是相同的值) “价格”-即加号后的11位数值。最后两位数字指定分的金额 Value from the example: 102,99$ 我需要这两个数据都在我的Datagrid视图中的同一行中,也需要这

我从文本文件中获取数据。文件本身已经被
ReadAllLines
插入并转换为字符串-这对我来说很好,我用MessageBox检查了内容

文本文件如下所示(大约千行中只有一行):

现在这是2条记录,我需要每条记录中的2个数据

  • “XY编号”-这些是“16XY”之后的前16位数字(16XY始终是相同的值)

  • “价格”-即加号后的11位数值。最后两位数字指定分的金额

       Value from the example: 102,99$
    
  • 我需要这两个数据都在我的Datagrid视图中的同一行中,也需要这个文本文件中的所有其他数据

    我所能想象的就是写一个代码,搜索“16XY”后的字符串并计算接下来的16位数字——与搜索“加号”并计算接下来的11位数字的价格相同。在这种情况下,我需要忽略文件的第一行,因为大约有10x“+”

    我尝试了几种可能性来搜索和计算这些值,但现在没有任何成功。我也不知道如何将数据放到特定的Datagrid视图中

    这就是我目前要展示的全部内容:

    List<List<string>> groups = new List<List<string>>();
                        List<string> current = null;
                        foreach (var line in File.ReadAllLines(path))
                        {
                            if (line.Contains("") && current == null)
                                current = new List<string>();                              
                            else if (line.Contains("") && current != null)
                            {
                                groups.Add(current);
                                current = null;
                            }
                            if (current != null)
                                current.Add(line);
                        }
    
                    //array
    
                    string output = string.Join(Environment.NewLine, current.ToArray());
    
                    //string
    
                    string final = string.Join("", output.ToCharArray());
                    MessageBox.Show(output);
    
    列表组=新列表();
    列表当前=空;
    foreach(文件中的var行.ReadAllLines(路径))
    {
    if(line.Contains(“”&¤t==null)
    当前=新列表();
    else if(line.Contains(“”&¤t!=null)
    {
    组。添加(当前);
    电流=零;
    }
    如果(当前!=null)
    当前。添加(行);
    }
    //排列
    字符串输出=string.Join(Environment.NewLine,current.ToArray());
    //串
    字符串final=string.Join(“,output.ToCharArray());
    MessageBox.Show(输出);
    

    提前谢谢

    创建一个
    结构
    来保存数据

    public class Data
    {
        String XYValue { set; get; }
        Decimal Price { set; get; }
    }
    
    然后读取逻辑(您可能需要添加更多检查)

    string decimalSeperator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    List<Data> results = new List<Data>();
    foreach(string line in File.ReadAllLines(path).Skip(1))
    {
        if (line == null)
            continue;
    
        int indexOfNextXY = 0;
        while (true)
        {
            int indexOfXY = line.IndexOf("16XY", indexOfNextXY) + "16XY".Length;
            int indexOfPlus = line.IndexOf("+", indexOfXY + 16) + "+".Length;
            indexOfNextXY = line.IndexOf("16XY", indexOfPlus);
    
            string xyValue = line.Substring(indexOfXY - 2, 18); // -2 to get the XY part
            string price = indexOfNextXY < 0 ? line.Substring(indexOfPlus) : line.Substring(indexOfPlus, indexOfNextXY - indexOfPlus);
    
            string intPart = price.Substring(0, price.Length - 2);
            string decimalPart = price.Substring(price.Length - 2);
            price = intPart  + decimalSeperator + decimalPart;
    
    
            results.Add(new Data (){ XYValue = xyValue, Price = Convert.ToDecimal(price) });
    
            if (indexOfNextXY < 0)
                break;
        }
    }
    
    string decimalseparator=CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    列表结果=新列表();
    foreach(文件中的字符串行.ReadAllLines(path).Skip(1))
    {
    如果(行==null)
    继续;
    int indexOfNextXY=0;
    while(true)
    {
    int indexOfXY=line.IndexOf(“16XY”,indexOfNextXY)+“16XY”。长度;
    int indexOfPlus=line.IndexOf(“+”,indexOfXY+16)+“+”.Length;
    indexOfNextXY=line.IndexOf(“16XY”,indexOfPlus);
    string xyValue=line.Substring(indexOfXY-2,18);//-2以获取XY部分
    string price=indexOfNextXY<0?line.Substring(indexOfPlus):line.Substring(indexOfPlus,indexOfNextXY-indexOfPlus);
    字符串intPart=price.Substring(0,price.Length-2);
    string decimalPart=price.Substring(price.Length-2);
    价格=整数+小数分隔符+小数部分;
    添加(新数据(){XYValue=XYValue,Price=Convert.ToDecimal(Price)});
    if(indexOfNextXY<0)
    打破
    }
    }
    
    考虑采用
    拆分
    方法。从示例数据中,我注意到每个值之间都有“16XY”。比如说:

    var data = "3016XY1234567891111111ABCDEFGHIJKabcdef+0000001029916XY1111111123456789ABCDEFGHIJKabcdef+00000003801";
    
    var records = data.Split(new string[] { "16XY" }, StringSplitOptions.RemoveEmptyEntries);
    
    <asp:GridView ID="gv" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Key" HeaderText="ID" />
            <asp:BoundField DataField="Value" HeaderText="Price" />
        </Columns>
    </asp:GridView>
    
    var values = final.Split(new string[] { "16XY" }, StringSplitOptions.RemoveEmptyEntries).ToList();
    
    List <YourModel> models = new List<YourModel>();
    
    foreach (var item in values)
    {
          if (item.IndexOf('+') > 0)
          {
                var itemSplit = item.Split('+');
                if (itemSplit[0].Length > 15 &&
                    itemSplit[1].Length > 10)
                {
                     models.Add(new YourModel(itemSplit[0].Substring(0, 16), itemSplit[1].Substring(0, 11)));
                }
          }
    }
    
    给定示例数据,这将返回以下数组:

    [0]: "30"
    [1]: "1234567891111111ABCDEFGHIJKabcdef+00000010299"
    [2]: "1111111123456789ABCDEFGHIJKabcdef+00000003801"
    
    现在可以更容易地计算每个字符串中的字符数,并在代码中赋予它们含义

    因此,我们知道有价值的数据由+分隔。让我们进一步拆分它并填充
    字典

    var parsed=新字典(records.Length-1);
    foreach(记录中的var pairX.Skip(1))
    {
    变量字段=pairX.Split('+');
    var cents=double.Parse(字段[1]);
    已解析。添加(字段[0],美分/100);
    }
    //现在绑定到GridView
    gv.DataSource=已解析;
    
    您的“GridView”声明应该如下所示:

    var data = "3016XY1234567891111111ABCDEFGHIJKabcdef+0000001029916XY1111111123456789ABCDEFGHIJKabcdef+00000003801";
    
    var records = data.Split(new string[] { "16XY" }, StringSplitOptions.RemoveEmptyEntries);
    
    <asp:GridView ID="gv" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Key" HeaderText="ID" />
            <asp:BoundField DataField="Value" HeaderText="Price" />
        </Columns>
    </asp:GridView>
    
    var values = final.Split(new string[] { "16XY" }, StringSplitOptions.RemoveEmptyEntries).ToList();
    
    List <YourModel> models = new List<YourModel>();
    
    foreach (var item in values)
    {
          if (item.IndexOf('+') > 0)
          {
                var itemSplit = item.Split('+');
                if (itemSplit[0].Length > 15 &&
                    itemSplit[1].Length > 10)
                {
                     models.Add(new YourModel(itemSplit[0].Substring(0, 16), itemSplit[1].Substring(0, 11)));
                }
          }
    }
    

    如果需要整个文本文件作为字符串,可以使用
    .Split
    方法对其进行操作

    操作将如下所示:

    var data = "3016XY1234567891111111ABCDEFGHIJKabcdef+0000001029916XY1111111123456789ABCDEFGHIJKabcdef+00000003801";
    
    var records = data.Split(new string[] { "16XY" }, StringSplitOptions.RemoveEmptyEntries);
    
    <asp:GridView ID="gv" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Key" HeaderText="ID" />
            <asp:BoundField DataField="Value" HeaderText="Price" />
        </Columns>
    </asp:GridView>
    
    var values = final.Split(new string[] { "16XY" }, StringSplitOptions.RemoveEmptyEntries).ToList();
    
    List <YourModel> models = new List<YourModel>();
    
    foreach (var item in values)
    {
          if (item.IndexOf('+') > 0)
          {
                var itemSplit = item.Split('+');
                if (itemSplit[0].Length > 15 &&
                    itemSplit[1].Length > 10)
                {
                     models.Add(new YourModel(itemSplit[0].Substring(0, 16), itemSplit[1].Substring(0, 11)));
                }
          }
    }
    
    之后,您可以将其绑定到gridview。

    鉴于“数据对”每行都是可变的(并且可能会被截断到下一行),因此最好改用File.ReadAllText()。这将为您提供一个要处理的字符串,从而消除截断问题

    var data = File.ReadAllText(path);
    
    定义包含数据的模型:

    public class Item {
      public string XYNumber { get; set; }
      public double Price { get; set; }
    }
    
    然后,您可以使用正则表达式查找匹配项并将其存储在列表中:

    var list = List<Item>();
    var regex = new Regex(@"(XY\d{16})\w+\+(\d{11})");
    var match = regex.Match(data);
    while (match.Success) {
      var ps = match.Group[1].Captures[0].Value.Insert(9, ".");
      list.Add(new Item { 
        XYNumber = match.Group[0].Captures[0].Value,
        Price = Convert.ToDouble(ps)
      });
      match = match.NextMatch();
    }
    

    文本文件是否使用换行符来定义单独的行,即file.ReadAllLines(…)是否返回字符串数组,或者它只是一个巨大的字符串?另外,在这个例子中,有2组XYNumber和Price对,它总是每行2对吗?它是一个巨大的字符串。每行随机显示多少对-这个自动化系统大约有15年的历史。。似乎每行有5对,有时是8-10对,有时也是拆分的(例如,价格在下一行中显示),但数据网格仍然是空的:(我的错!我忘了将“XY”更改为实际数据,无法在此处发布。现在得到错误信息了“索引超出了数组的边界。”关于行
    var cents=double.Parse(fields[1]);
    这意味着它无法按+%分割。它是否存在于您的真实数据中?我这边的代码运行良好。。。