C# 从文本文件中读取特定值并将其放入列表中
我有一个包含许多行的文本文件,每行看起来如下: 每个值之间的“string double”是一个空格。我想读出每行的第一个字符串和最后一个double,并将这两个值放入现有列表中。到目前为止,这是我的代码,但它实际上不起作用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");
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])
};
}
所以你需要第一个和最后一个字?还是第一个“字符串”和最后一个“双精度”精确单词?@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
来避免类似€-更新了我的答案我不知道,谢谢你的提示