C# 从文本文件中读取特定值并将其放入列表中

C# 从文本文件中读取特定值并将其放入列表中,c#,list,text-files,readline,C#,List,Text Files,Readline,我有一个包含许多行的文本文件,每行看起来如下: 每个值之间的“string double”是一个空格。我想读出每行的第一个字符串和最后一个double,并将这两个值放入现有列表中。到目前为止,这是我的代码,但它实际上不起作用 private void bOpen_Click(object sender, RoutedEventArgs e) { bool exists = File.Exists(@"C:\Users\p2\Desktop\Liste.txt");

我有一个包含许多行的文本文件,每行看起来如下: 每个值之间的“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++;
                }
            }
        }
我已经读过这篇文章了,但是没有用。你呢

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();
List Result=File.ReadLines(@“C:\Users\p2\Desktop\Liste.txt”)
.选择(x=>new Vgl()
{
name=x.Split(“”).First(),
gErg=decimal.Parse(x.Split(“”).Last(),NumberStyles.AllowCurrencySymbol)
}) 
.ToList();
我会避免将钱存储在双倍值内,因为这可能会导致舍入问题。改用
decimal
。这里的例子:

怎么样

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();
List Result=File.ReadLines(@“C:\Users\p2\Desktop\Liste.txt”)
.选择(x=>new Vgl()
{
name=x.Split(“”).First(),
gErg=decimal.Parse(x.Split(“”).Last(),NumberStyles.AllowCurrencySymbol)
}) 
.ToList();
我会避免将钱存储在双倍值内,因为这可能会导致舍入问题。改用
decimal
。示例如下:

您可以尝试Linq:

var source=File
.ReadLines(@“C:\Users\p2\Desktop\Liste.txt”)
.Select(line=>line.Split(“”))
.选择(项=>新Vgl(){
名称=项目[0],
gErg=double.Parse(项[3])
});
//如果要添加到现有列表中
GlobaleDaten.VglDaten.AddRange(源);
//如果要创建新列表
//List=source.ToList();
您可以尝试Linq:

var source=File
.ReadLines(@“C:\Users\p2\Desktop\Liste.txt”)
.Select(line=>line.Split(“”))
.选择(项=>新Vgl(){
名称=项目[0],
gErg=double.Parse(项[3])
});
//如果要添加到现有列表中
GlobaleDaten.VglDaten.AddRange(源);
//如果要创建新列表
//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);
您可以使用:

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

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

有关使用拆分的参考:

使用string.split,使用空格作为分隔符,将字符串按每一个值排列成一个数组。然后只访问第一个和最后一个数组元素。当然,如果您不能绝对确定每一行正好包含4个值,您可能需要检查数组的长度,以确保至少有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])
              };
   }

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


  • 所以你需要第一个和最后一个字?还是第一个“字符串”和最后一个“双精度”精确单词?@user3185569每个单词的值。例如:Name 500您打算如何将值放入列表中?“像一根被空格隔开的绳子吗?”Mong Zhu是的,正如你所说。“我没有其他线索可以把它分开。”塞伯丹默你试过我的答案了吗?所以你需要第一个和最后一个单词?还是第一个“字符串”和最后一个“双精度”精确单词?@user3185569每个单词的值。例如:Name 500您打算如何将值放入列表中?“像一根被空格隔开的绳子吗?”Mong Zhu是的,正如你所说。我没有其他线索可以把它分开。@SebDammer你试过我的答案吗?应该把它放在我代码的while循环中吗?因为如果我没有,它会显示一些errors@SebDammer它应该在代码中的while
    ((line=sr.ReadLine())!=null){}
    中。它似乎可以工作。但我得重写一些代码。我需要将这些值放入另一个类中比较方法的列表中。您的方法似乎与€-符号有一些问题,就像fubo的方法一样。@SebDammer检查编辑以处理货币符号。是否应该将其放在我代码的while循环中?因为如果我没有,它会显示一些errors@SebDammer它应该在代码中的while
    ((line=sr.ReadLine())!=null){}
    中。它似乎可以工作。但我得重写一些代码。我需要将这些值放入另一个类中比较方法的列表中。您的方法似乎与€-符号有一些问题,就像fubo的方法一样。@SebDammer检查编辑以处理货币符号。即使使用我的比较方法,效果也很好。谢谢!:)即使使用我的比较方法,效果也很好。谢谢!:)@Sebdamer你可以使用
    numberstyle.AllowCurrencySymbol
    来避免类似€-更新了我的答案我不知道,谢谢你的提示