从文本文件中读取特定值并将它们放在列表中

时间:2016-07-07 06:29:18

标签: c# list text-files readline

我有一个包含许多行的文本文件,每行看起来像这样: "字符串字符串double double"每个值之间是一个空格。我想读出每一行的第一个字符串和最后一个字符串,并将这两个值放在现有列表中。到目前为止,这是我的代码,但它确实没有用。

    private void bOpen_Click(object sender, RoutedEventArgs e)
    {
        bool exists = File.Exists(@"C:\Users\p2\Desktop\Liste.txt");

        if (exists == true)
        {
            StringBuilder sb = new StringBuilder();

            using (StreamReader sr = new StreamReader(@"C:\Users\p2\Desktop\Liste.txt"))
            {
                Vgl comp = new Vgl();
                comp.name = Abzahlungsdarlehenrechner.zgName;
                comp.gErg = Abzahlungsdarlehenrechner.zgErg;

                GlobaleDaten.VglDaten.Add(comp);


                int i = 0;
                string line = File.ReadLines(@"Liste.txt").Skip(0).Take(1).First();
                while ((line = sr.ReadLine()) != null)
                {
                    sb.Append((line));
                    listBox.Items.Add(line);
                    GlobaleDaten.VglDaten.Add(comp);

                    i++;
                }
            }
        }

我已经读过这篇文章,但它没有帮助How do I read specific value[...]

6 个答案:

答案 0 :(得分:2)

怎么样

List<Vgl> Result = File.ReadLines(@"C:\Users\p2\Desktop\Liste.txt")
            .Select(x => new Vgl()
            {
                name = x.Split(' ').First(),
                gErg = decimal.Parse(x.Split(' ').Last(), NumberStyles.AllowCurrencySymbol)
            }) 
            .ToList();

我会避免在doulbe值中存储钱,因为这可能会导致舍入问题。请改用decimal。例如:Is a double really unsuitable for money?

答案 1 :(得分:2)

您可以尝试 Linq

var source = File
  .ReadLines(@"C:\Users\p2\Desktop\Liste.txt")
  .Select(line => line.Split(' '))
  .Select(items => new Vgl() {
       name = items[0], 
       gErg = double.Parse(items[3])
     });

// If you want to add into existing list
GlobaleDaten.VglDaten.AddRange(source);

// If you want to create a new list
//List<Vgl> list = source.ToList();

答案 2 :(得分:1)

您可以使用:

string[] splitBySpace = line.Split(' ');

string first = splitBySpace.ElementAt(0);
decimal last = Convert.ToDecimal(splitBySpace.ElementAt(splitBySpace.Length - 1));

编辑:处理货币符号:

string[] splitBySpace = line.Split(' ');
string pattern = @"[^0-9\.\,]+";

string first = splitBySpace.ElementAt(0);
string last = (new Regex(pattern)).Split(splitBySpace.ElementAt(splitBySpace.Length - 1))
                                    .FirstOrDefault();

decimal lastDecimal;
bool success = decimal.TryParse(last, out lastDecimal);

答案 3 :(得分:1)

我同意@Dmitry和fubo,如果你正在寻找其他选择,你可以尝试一下。

var source = File
  .ReadLines(@"C:\Users\p2\Desktop\Liste.txt")
  .Select(line =>
   {
        var splits = line.Split(' '));
        return new Vgl() 
              {
                  name = splits[0], 
                 gErg = double.Parse(splits[3])
              };
   }

答案 4 :(得分:0)

使用string.split,使用space作为分隔符,将字符串放到具有每个值的数组中。然后只需访问第一个和最后一个数组元素。当然,如果您不确定每行包含4个值,您可能需要检查数组的长度以确保至少有4个值。

使用分裂的参考: https://msdn.microsoft.com/en-us/library/ms228388.aspx

答案 5 :(得分:0)

  1. 将整个文件作为字符串读取。
  2. 使用\ r \ n作为行分隔符在foreach循环中拆分字符串。将每一行添加到字符串列表中。
  3. 遍历该列表并使用空格作为字段分隔符再次拆分另一个循环中的每个记录,并将它们放入另一个字符串列表中。
  4. 现在您将所有四个字段包含一行。现在只需使用First和Last方法获取第一个单词和最后一个数字。