Rya*_*hel 55 c# text file stream
存在File.ReadAllLines
但不存在Stream.ReadAllLines
.
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt"))
using (StreamReader reader = new StreamReader(stream))
{
// Would prefer string[] result = reader.ReadAllLines();
string result = reader.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,还是我必须逐行手动循环文件?
Jon*_*eet 96
你可以编写一个逐行读取的方法,如下所示:
public IEnumerable<string> ReadLines(Func<Stream> streamProvider,
Encoding encoding)
{
using (var stream = streamProvider())
using (var reader = new StreamReader(stream, encoding))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后将其称为:
var lines = ReadLines(() => Assembly.GetExecutingAssembly()
.GetManifestResourceStream(resourceName),
Encoding.UTF8)
.ToList();
Run Code Online (Sandbox Code Playgroud)
该Func<>
部分是在不止一次阅读时应对,并避免不必要地打开流.当然,您可以轻松地将该代码包装在一个方法中.
如果你不需要一次在内存中,你甚至不需要ToList
......
小智 36
该.EndOfStream
属性可以在循环中使用,而不是检查下一行是否为空.
List<string> lines = new List<string>();
using (StreamReader reader = new StreamReader("example.txt"))
{
while(!reader.EndOfStream)
{
lines.Add(reader.ReadLine());
}
}
Run Code Online (Sandbox Code Playgroud)
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt"))
using (StreamReader reader = new StreamReader(stream))
{
// Would prefer string[] result = reader.ReadAllLines();
string[] result = reader.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
}
Run Code Online (Sandbox Code Playgroud)
使用在Split
这里:
reader
.ReadToEnd()
.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)
不等于ReadLine
.如果你看一下源ReadLine
,StreamReader.cs,你会看到,它处理行结束符:\ r \n和\ r \n正确.ReadLine
当行终止符是\ r \n时,不会返回额外的空字符串,这在DOS/Windows中是典型的.Split
"see"(解析)\ r后跟\n作为2个单独的分隔符并返回一个空字符串.
上面代码中的'StringSplitOptions.RemoveEmptyEntries'确实删除了这些空字符串,但它也会删除输入中出现的所有空行.
因此,对于输入line1\r\r \n,line3\r \n
ReadLine
返回3行.第二个是空的.
Split
创建4个字符串.(最后一个\ r \n后面还有一个字符串.)然后删除第二个和第四个字符串.
请注意,Split
它不适合解析"后修复"分隔的文本行.这是在令牌之后出现的分隔符.虽然Split
适用于中缀,但分隔符出现在令牌之间.它是a,b,c和line1\r \n,line2,line3\r \n之间的差异.对于这些输入,分别Split
返回3个字符串或4个字符串.
使用以下扩展方法:
public static class Extensions
{
public static IEnumerable<string> ReadAllLines(this StreamReader reader)
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
Run Code Online (Sandbox Code Playgroud)
可以得到您想要的代码:
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt"))
using (StreamReader reader = new StreamReader(stream))
{
string[] result = reader.ReadAllLines().ToArray();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53983 次 |
最近记录: |