将复杂文件读入组合框
本文关键字:组合 复杂 文件 | 更新日期: 2023-09-27 18:35:12
所以我尝试了一些研究,但我只是不知道如何谷歌这个。
例如,我得到了一个.db(对我来说与.txt相同)文件,写成这样:
DIRT: 3;
STONE: 6;
到目前为止,我得到了一个代码,可以将项目放入组合框中,如下所示:
DIRT,
STONE,
将把污垢和石头放在组合框中。这是我为此使用的代码:
string[] lineOfContents = System.IO.File.ReadAllLines(dbfile);
foreach (var line in lineOfContents)
{
string[] tokens = line.Split(',');
comboBox1.Items.Add(tokens[0]);
}
我如何扩展它,以便将例如 DIRT 和 STONE 放在组合框中,并将其余的 (3) 保留在变量中(ints,如 int varDIRT = 3)?如果需要,它不必是 txt 或 db 文件。我听说XML也是配置文件。
尝试做这样的事情:
cmb.DataSource = File.ReadAllLines("filePath").Select(d => new
{
Name = d.Split(',').First(),
Value = Convert.ToInt32(d.Split(',').Last().Replace(";",""))
}).ToList();
cmb.DisplayMember = "Name";
cmb.ValueMember= "Value";
请记住,它需要使用using System.Linq;
如果要引用组合框的选定值,可以使用 cmb.SelectedValue;
cmb.SelectedText;
你真的有两个问题,所以我会尝试分别回答它们。
第一个问题是"如何解析如下所示的文件......
DIRT: 3;
STONE: 6;
变成名称和整数?您可以从每行中删除所有空格和分号,然后在冒号上拆分。在我看来,一个更干净的方法是使用正则表达式:
// load your file
var fileLines = new[]
{
"DIRT: 3;",
"STONE: 6;"
};
// This regular expression will match anything that
// begins with some letters, then has a colon followed
// by optional whitespace ending in a number and a semicolon.
var regex = new Regex(@"('w+):'s*([0-9])+;", RegexOptions.Compiled);
foreach (var line in fileLines)
{
// Puts the tokens into an array.
// The zeroth token will be the entire matching string.
// Further tokens will be the contents of the parentheses in the expression.
var tokens = regex.Match(line).Groups;
// This is the name from the line, i.e "DIRT" or "STONE"
var name = tokens[1].Value;
// This is the numerical value from the same line.
var value = int.Parse(tokens[2].Value);
}
如果你不熟悉正则表达式,我鼓励你看看它们;它们使格式化字符串和提取值变得非常容易 http://regexone.com/。
第二个问题,"如何将值与名称一起存储?",我不确定我是否完全理解。如果你想做的是用文件中指定的数值返回每个项目,dub stylee的建议对你有好处。需要将名称作为显示成员,将值作为值成员。但是,由于数据不在表中,因此必须将数据放在可访问的位置,以便可以命名要使用的属性。我推荐一本字典:
// This is your ComboBox.
var comboBox = new ComboBox();
// load your file
var fileLines = new[]
{
"DIRT: 3;",
"STONE: 6;"
};
// This regular expression will match anything that
// begins with some letters, then has a colon followed
// by optional whitespace ending in a number and a semicolon.
var regex = new Regex(@"('w+):'s*([0-9])+;", RegexOptions.Compiled);
// This does the same as the foreach loop did, but it puts the results into a dictionary.
var dictionary = fileLines.Select(line => regex.Match(line).Groups)
.ToDictionary(tokens => tokens[1].Value, tokens => int.Parse(tokens[2].Value));
// When you enumerate a dictionary, you get the entries as KeyValuePair objects.
foreach (var kvp in dictionary) comboBox.Items.Add(kvp);
// DisplayMember and ValueMember need to be set to
// the names of usable properties on the item type.
// KeyValue pair has "Key" and "Value" properties.
comboBox.DisplayMember = "Key";
comboBox.ValueMember = "Value";
在这个版本中,我使用 Linq 来构造字典。如果您不喜欢 Linq 语法,可以改用循环:
var dictionary = new Dictionary<string, int>();
foreach (var line in fileLines)
{
var tokens = regex.Match(line).Groups;
dictionary.Add(tokens[1].Value, int.Parse(tokens[2].Value));
}
您也可以使用 FileHelpers 库。首先定义数据记录。
[DelimitedRecord(":")]
public class Record
{
public string Name;
[FieldTrim(TrimMode.Right,';')]
public int Value;
}
然后,您可以像这样读取数据:
FileHelperEngine engine = new FileHelperEngine(typeof(Record));
//Read from file
Record[] res = engine.ReadFile("FileIn.txt") as Record[];
// write to file
engine.WriteFile("FileOut.txt", res);