将复杂文件读入组合框

本文关键字:组合 复杂 文件 | 更新日期: 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);