【问题标题】:Read specific values out of a text-file and put them in a list从文本文件中读取特定值并将它们放入列表中
【发布时间】:2016-07-07 06:29:18
【问题描述】:

我有一个包含多行的文本文件,每一行如下所示: “string string 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[...]

【问题讨论】:

  • 所以你需要第一个词和最后一个词?还是第一个“字符串”和最后一个“双”字?
  • @user3185569 每个的值。例如:姓名 500
  • 您打算如何将值放入列表中?作为用空格分隔的字符串?
  • @Mong Zhu 是的,正如你所说。我不知道如何将它分开。
  • @SebDammer 你试过我的答案了吗?

标签: c# list text-files readline


【解决方案1】:

你可以试试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】:

怎么样

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?

【讨论】:

  • @SebDammer 您可以使用NumberStyles.AllowCurrencySymbol 来避免欧元等货币符号的例外情况——更新了我的答案
  • 不知道,感谢您的提示 :) 但突然它一直显示错误,无论我使用哪种代码。例如,Dmitry Bychenkos 的代码运行流畅。再次出现“System.FormatException”...
  • 好的,不知道文件很难说。字符串中的空格或 , 而不是 . 作为分隔符可能是原因。
  • 似乎 NumberStyles.CurrencySymbol 是原因。你知道为什么它不起作用吗?我的列表条目的代码是:listBox.Items.Add(Ab.zgName + " " + "[Ab]" + " " +Ab.zmErg.ToString("0.00") + "€" + " " + Ab。 zgErg.ToString("0.00") + "€");
  • Ab.zgName 可以包含空格吗?这可能是一个原因
【解决方案3】:

你可以使用:

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

【讨论】:

  • 应该把它放在我的代码的while循环中吗?因为如果我不显示一些错误
  • @SebDammer 它应该在您的代码中的 while ((line = sr.ReadLine()) != null) { } 内。
  • 它似乎有效。但是我将不得不稍微重写我的一些代码。我需要将值放在另一个类中的比较方法的列表中。就像 fubo 的方法一样,您的方法似乎与 €-Signs 有一些问题。
  • @SebDammer 检查编辑以处理货币符号。
【解决方案4】:

我同意@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])
              };
   }

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多