读取每第n个字符出现行的文本文件

时间:2014-03-18 09:13:17

标签: c# string split

我想使用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....

以某种方式可以管理这个吗?也许正则表达式?我的文本文件包含数百个" |"。

2 个答案:

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