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个数据
Value from the example: 102,99$
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]);
这意味着它无法按+%分割。它是否存在于您的真实数据中?我这边的代码运行良好。。。