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

Read specific values out of a text-file and put them in a list

我有一个包含很多行的文本文件,每一行如下所示: "string string double double"每个值之间是一个space。我想读出每行的第一个字符串和最后一个双精度值,并将这两个值放入现有列表中。到目前为止,这是我的代码,但它并没有真正起作用。

    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[...]

怎么样

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

我会避免将钱存储在双精度值内,因为这可能会导致舍入问题。请改用 decimal。这里的例子:Is a double really unsuitable for money?

你可以试试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();

您可以使用:

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

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

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

我同意@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])
              };
   }
  1. 以字符串形式读取整个文件。
  2. 使用 \r\n 作为行分隔符在 foreach 循环中拆分字符串。将每一行添加到字符串列表中。
  3. 遍历该列表并使用 space 作为字段分隔符在另一个循环中再次拆分每条记录,并将它们放入另一个字符串列表中。
  4. 现在所有四个字段都包含一行。现在只需使用 First 和 Last 方法来获取第一个单词和最后一个数字。