如何加载包含多行的文本文件?
How can I load a textfile with many rows?
我有一些文本文件类似于以下文件:
0,75;1,20;true;4,50;4,30;3,30;false
0,75;1,20;true;4,50;4,30;4,30;true
我这样加载文本文件:
private const string filename = "Data.txt";
string[] strs;
public void LoadTextfile()
{
System.IO.Stream stream = TitleContainer.OpenStream(filename);
System.IO.StreamReader reader = new System.IO.StreamReader(stream);
strs = reader.ReadLine().Split(';');
game1.StatsList.Add(new Containerclass.StatsContainer(float.Parse(strs[0], culture), float.Parse(strs[1], culture), bool.Parse(strs[2]), float.Parse(strs[3], culture), float.Parse(strs[4], culture), float.Parse(strs[5], culture), bool.Parse(strs[6])));
strs = reader.ReadLine().Split(';');
game1.StatsList.Add(new Containerclass.StatsContainer(float.Parse(strs[0], culture), float.Parse(strs[1], culture), bool.Parse(strs[2]), float.Parse(strs[3], culture), float.Parse(strs[4], culture), float.Parse(strs[5], culture), bool.Parse(strs[6])));
但是我的文本文件比上面的文本文件有更多的条目(超过 100 个)。此外,我不知道任何文本文件的行数。也许一个文本文件有 110 行,第二个文本文件有 150 行,等等。
如果我不知道行数,是否可以通过循环加载所有内容?我应该使用哪个循环来加载整个文本文件?我知道我不能使用 for 循环,因为我不知道文本文件有多少行,是否可以用另一个循环加载它?还是不能用一个循环加载整个文本文件?
File.ReadLines(string path)
真不错
string[] lines = File.ReadLines("filename.txt").ToArray();
如果你实在想花哨,可以试试linq
game1.StatsList = File.ReadLines("Data.txt")
.Select(s =>
{
var strs = s.Split(';');
return new Containerclass.StatsContainer(float.Parse(strs[0], culture), float.Parse(strs[1], culture), bool.Parse(strs[2]), float.Parse(strs[3], culture), float.Parse(strs[4], culture), float.Parse(strs[5], culture), bool.Parse(strs[6]));
})
.ToList();
请注意,for
循环可以是 运行 而无需明确知道要迭代的元素数量 - 中央语句可以是 any 条件评估bool
,而不仅仅是 i < number
using (var reader = new StreamReader(stream))
{
for(string line = reader.ReadLine();
reader.EndOfFile == false;
line = reader.ReadLine())
{
//...
}
}
使用 File.ReadLines
还可以让您使用 foreach
-
遍历每一行
foreach(string line in File.ReadLines(filename))
{
//...
}
更明确一点,您还可以使用 StreamReader.ReadToEnd
和 Splt
结果
foreach(var line in new StreamReader(stream)
.ReadToEnd()
.Split(new [] {"\r\n" }, StringSplitOptions.RemoveEmptyEntries)
{
//...
}
我有一些文本文件类似于以下文件:
0,75;1,20;true;4,50;4,30;3,30;false
0,75;1,20;true;4,50;4,30;4,30;true
我这样加载文本文件:
private const string filename = "Data.txt";
string[] strs;
public void LoadTextfile()
{
System.IO.Stream stream = TitleContainer.OpenStream(filename);
System.IO.StreamReader reader = new System.IO.StreamReader(stream);
strs = reader.ReadLine().Split(';');
game1.StatsList.Add(new Containerclass.StatsContainer(float.Parse(strs[0], culture), float.Parse(strs[1], culture), bool.Parse(strs[2]), float.Parse(strs[3], culture), float.Parse(strs[4], culture), float.Parse(strs[5], culture), bool.Parse(strs[6])));
strs = reader.ReadLine().Split(';');
game1.StatsList.Add(new Containerclass.StatsContainer(float.Parse(strs[0], culture), float.Parse(strs[1], culture), bool.Parse(strs[2]), float.Parse(strs[3], culture), float.Parse(strs[4], culture), float.Parse(strs[5], culture), bool.Parse(strs[6])));
但是我的文本文件比上面的文本文件有更多的条目(超过 100 个)。此外,我不知道任何文本文件的行数。也许一个文本文件有 110 行,第二个文本文件有 150 行,等等。 如果我不知道行数,是否可以通过循环加载所有内容?我应该使用哪个循环来加载整个文本文件?我知道我不能使用 for 循环,因为我不知道文本文件有多少行,是否可以用另一个循环加载它?还是不能用一个循环加载整个文本文件?
File.ReadLines(string path)
真不错
string[] lines = File.ReadLines("filename.txt").ToArray();
如果你实在想花哨,可以试试linq
game1.StatsList = File.ReadLines("Data.txt")
.Select(s =>
{
var strs = s.Split(';');
return new Containerclass.StatsContainer(float.Parse(strs[0], culture), float.Parse(strs[1], culture), bool.Parse(strs[2]), float.Parse(strs[3], culture), float.Parse(strs[4], culture), float.Parse(strs[5], culture), bool.Parse(strs[6]));
})
.ToList();
请注意,for
循环可以是 运行 而无需明确知道要迭代的元素数量 - 中央语句可以是 any 条件评估bool
,而不仅仅是 i < number
using (var reader = new StreamReader(stream))
{
for(string line = reader.ReadLine();
reader.EndOfFile == false;
line = reader.ReadLine())
{
//...
}
}
使用 File.ReadLines
还可以让您使用 foreach
-
foreach(string line in File.ReadLines(filename))
{
//...
}
更明确一点,您还可以使用 StreamReader.ReadToEnd
和 Splt
结果
foreach(var line in new StreamReader(stream)
.ReadToEnd()
.Split(new [] {"\r\n" }, StringSplitOptions.RemoveEmptyEntries)
{
//...
}