如何在csv文件中获取匹配值?

时间:2013-12-14 20:36:49

标签: c# csv

所以我有一个包含2列的.csv文件看起来有点像这样:
01,23
02,45
03178
等。

现在我想读取csv文件,为第一列提供一个值,然后从第二列获取相应的值。 (所以说我给它一个值03,它应该给我178回)
这是我到目前为止的代码,但if语句应该包含哪些内容?

public int CalculateNextLevel(int current_xp, int current_lvl)
    {
        var reader = new StreamReader(File.OpenRead(@"C:\Users\Lennart\Desktop\Legends of Raymere\Files\Lvl.csv"));
        List<int> levels = new List<int>();
        List<int> exp = new List<int>();
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(',');

            levels.Add(Convert.ToInt32(values[0]));
            exp.Add(Convert.ToInt32(values[1]));

            foreach (int level in levels)
            {
                if (current_lvl == level)
                {

                }
            }
        }

        return XP_to_nxt_lvl;
    }

4 个答案:

答案 0 :(得分:1)

您可以使用Dictionary代替

var expValues = new Dictionary<int, int>();

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();
    var values = line.Split(',');

    expValues.Add(Convert.ToInt32(values[0]), Convert.ToInt32(values[1]));
}

// Retrieve value based on level
if (expValues.ContainsKey(3))
{
   int level03Exp = expValues[3];
}

答案 1 :(得分:1)

试试这个

    static void Main(string[] args)
    {
        string key = "03";
        GetValue(key);        
    }

    private static int GetValue(string key)
    {
        var lines = File.ReadAllLines("test.txt");
        var dictonary = lines.ToDictionary(dict =>
        {
            return dict.Split(',')[0];
        });          
        int valInt = int.Parse(dictonary[key].Split(',')[1]);
        return valInt; 
    }

答案 2 :(得分:0)

你应该像这样使用Linq:

 foreach (int level in levels)
            {
                if (current_lvl == level)
                {
                 XP_to_nxt_lvl = exp[levels.IndexOf(level)];
                }
            }

答案 3 :(得分:0)

您可以使用LINQLookup<TKey, TValue>来允许重复键,但类似于Dictionary。如果密钥(级别)不存在,则会得到一个空的xp集合:

private ILookup<int, int> LevelLookup = null;
public void LoadAllLevels()
{
    LevelLookup = File.ReadLines(@"C:\Temp\Lvl.csv")
        .Select(l => l.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        .Select(cols => 
        {
            int level = 0, xp = 0;
            bool validLine = cols.Length == 2;
            if(validLine)
                validLine = int.TryParse(cols[0].Trim(), out level);
            if(validLine)
                validLine = int.TryParse(cols[1].Trim(), out xp);
            return new{ level, xp, validLine };
        })
        .Where(x => x.validLine)
        .ToLookup(x => x.level, x => x.xp);
}

public int? CalculateNextLevel(int current_xp, int current_lvl)
{
    int? nextLevel = null;
    var xps = LevelLookup[current_lvl];
    if (xps.Any())
        nextLevel = xps.First();
    return nextLevel;
}

您只需要初始化一次或通过LoadAllLevels()更改文件。

例如:

LoadAllLevels();
int level3 = 3;
int level4 = 4;
int? xp3 = CalculateNextLevel(100,level3);
int? xp4 = CalculateNextLevel(150,level4);

我使用了nullables来区分XP = 0并且某个级别还没有定义xp。

bool hasLev4XP = xp4.HasValue;
if(hasLev4XP)
{
    int lev4XpNeeded = xp4.Value;
}

如果保证级别是唯一的,您还可以使用ToDictionary创建字典并使用与上面类似的代码。