c# - 将复杂文件读入comboBox

时间:2014-12-22 21:48:38

标签: c# database file-io combobox file-read

所以我尝试了一些研究,但我不知道如何谷歌这个..

例如,我得到了一个.db(与我的.txt相同)文件,如下所示:

DIRT: 3;
STONE: 6;

到目前为止,我有一个代码可以将项目放在这样的组合框中:

DIRT,
STONE,

将DIRT和STONE放在comboBox中。这是我用过的代码:

        string[] lineOfContents = System.IO.File.ReadAllLines(dbfile);
        foreach (var line in lineOfContents)
        {
            string[] tokens = line.Split(',');
            comboBox1.Items.Add(tokens[0]);
        }

我如何扩展它以便例如组合框中的DIRT和STONE,并将其余的(3)保留在变量中(整数,如int varDIRT = 3)? 如果你愿意,它不必是txt或db文件..我听说xml也是配置文件。

3 个答案:

答案 0 :(得分:2)

尝试做这样的事情:

            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;

答案 1 :(得分:1)

我认为你真的有两个问题,所以我会尝试单独回答。

第一个问题是“如何解析看起来像这样的文件......

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));
}

答案 2 :(得分:0)

您也可以使用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);