我想使用streamreader读取文本文件,如下所示:
using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
string text = sr.ReadToEnd();
string[] lines = text.Split('**Every 8th |**');
foreach(string line in lines)
{
.....
}
}
我的文本文件包含值除以" |"。每8" |"包含我需要使用的新的值组。例如,我有这个:
1|2|3|4|5|6|7|8|9|10|11....
我需要的是
1|2|3|4|5|6|7|8
9|10|11....
以某种方式可以管理这个吗?也许正则表达式?我的文本文件包含数百个" |"。
答案 0 :(得分:1)
也许你想为每个"伪线"获得string[]
:
string text = File.ReadAllText(FileName, Encoding.Default);
string[] fields = text.Split('|');
IEnumerable<string[]> lines = fields
.Select((f, i) => new { Field = f, Index = i })
.GroupBy(x => x.Index / 8)
.Select(g => g.Select(x => x.Field).ToArray());
foreach(string[] lineFields in lines)
Console.WriteLine(string.Join(", ", lineFields));
答案 1 :(得分:0)
如果文件非常大或者您想要以不同的大小进行分块,则可能更喜欢更通用的内容。
IEnumerable<IEnumerable<string>> ReadFileInChunks(
string fileName,
char[] separators,
int chunkSize)
{
string[] bucket = null;
var count = 0;
foreach(var item in SplitFile(fileName, sperators))
{
if (bucket == null)
{
bucket = new string[chunkSize]
}
bucket[count++] = item;
if (count != size)
{
continue;
}
yield return bucket;
bucket = null;
count = 0;
}
// Alternatively, throw an exception if bucket != null
if (bucket != null)
{
yield return bucket.Take(count);
}
}
private IEnumerable<string> SplitFile(
string FileName,
char[] separators)
{
var check = new HashSet<int>(seperators.Select(c => (int)c);
var buffer = new StringBuilder();
using (var reader = new StreamReader(FileName))
{
var next = reader.Read();
while(next != -1)
{
if (check.Contains(next))
{
yield return buffer.ToString();
buffer.Clear();
continue;
}
buffer.Append((char)next);
next = reader.Read();
}
}
if (buffer.Length > 0)
{
yield return buffer.ToString();
}
}
这将一次读取您的文件char
,如果文件很大,那就好了,如果不是,那就不错。它会懒散地按照您指定的大小生成组。
foreach (var row in ReadFileInChunks(FileName, new[] { '|' }, 8))
{
foreach (var item in row)
{
// ...
}
}
或者,如果你真的想重新加入这些值,
var results = ReadFileInChunks(FileName, new[] { '|' }, 8).Select(row =>
string.Join("|", row));