动态创建新的List <strings>并添加n行数-C#

时间:2018-08-23 20:14:52

标签: c# list streamreader

我正在尝试使用StreamReader读取文件。该文件包含以下数据(还有40,000行!):

    Tyndall Centre grim file created on 22.01.2004 at 17:57 by Dr. Tim Mitchell
.pre = precipitation (mm)
CRU TS 2.1
[Long=-180.00, 180.00] [Lati= -90.00,  90.00] [Grid X,Y= 720, 360]
[Boxes=   67420] [Years=1991-2000] [Multi=    0.1000] [Missing=-999]
Grid-ref=   1, 148
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
Grid-ref=   1, 311
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
Grid-ref=   1, 312
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410

我设法读取了前5行并将这些行添加到列表中。现在,我想阅读包含以下内容的行:

  

Grid-ref = 1,148

和下面的10行,因此它刚读完:

  

Grid-ref = 1,311

然后我想将这些行添加到新列表中,但是,我不想一遍又一遍地创建新列表。

到目前为止,它捕获了这两行:

  

Grid-ref = 1,148

     

3020 2820 3040 2880 1740 1360 980 990 1410 1770 2580 2630

这是我到目前为止所拥有的:

    private void button1_Click(object sender, EventArgs e)
{

    var list = new List<string>();
    List<string> HeaderParse = new List<string>();

    List<string> GridRefList = new List<string>();


    var regex = new Regex(@"(Grid-ref)");

    using (var sr = new StreamReader("cru-ts-2-10.1991-2000-cutdown.pre"))
    {
        string line;
        while((line = sr.ReadLine()) != null)
        {
            list.Add(line);
        }

        for(int a = 0; a < list.Count; a++)
        {
            if (!regex.IsMatch(list[a]))
            {
                HeaderParse.Add(list[a]);
            }
            else
            {
                break;
            }
        }

        for(int b = 0; b < list.Count; b++)
        {
            if (regex.IsMatch(list[b]))
            {
                GridRefList.Add(list[b]);

                b++;

                if (!regex.IsMatch(list[b]))
                {
                    GridRefList.Add(list[b]);
                }
                break;
            }
        }

    }

    MessageBox.Show("This button has been clicked");
}

我需要有关如何告诉StreamReader在比赛后读取下10行并在遇到包含“ Grid-ref”的新行时创建新列表的帮助。

3 个答案:

答案 0 :(得分:1)

这不是您对特定问题的答案,而是更多您可以采用的可能的设计实现途径。不确定如何使用数据,但是您可以手动将这些数据序列化为支持您要执行的工作类型的自定义类:

public class PrecipitationFile
{
    string FileName { get; }
    public IList<PrecipitationGrid> Grids { get; }
    int BoxCount { get; }
    double Multi { get; }
    int Missing { get; }
    IList<string> Years { get; }

    public PrecipitationFile(string filePath)
    {
        // Read file, set properties, split by grid-ref chunks
        // Grids.Add(new PrecipitationGrid(this, chunk));
    }
}

public class PrecipitationGrid
{
    int Id { get; }
    int Ref { get; }
    PrecipitationFile Header { get; }
    string Source { get; }
    IList<int> GridNumbers { get; set; }

    public PrecipitationGrid(PrecipitationFile header, string source)
    {
        // set properties
    }
}

答案 1 :(得分:0)

列出列表。每次遇到“ Grid-ref”时,都在深度1处创建一个新列表。在深度2处添加10行左右的数据。这样,所有数据都包含在一个大列表中,但整齐地进行了分段。

List<List<string>> data = new List<List<string>>();
var list = new List<string>();
var regex = new Regex(@"(Grid-ref)");

using (var sr = new StreamReader("cru-ts-2-10.1991-2000-cutdown.pre"))
{
    string line;
    while((line = sr.ReadLine()) != null)
    {
        list.Add(line);
    }

    for(int i = 0; i < list.Count; i++)
    {
        if (regex.IsMatch(list[i])) //line matches "Grid=ref"
        {
            List<string> data_block = new List<string>(); //data_block is for the 10 lines
            data.Add(data_block); //add data_block list to bigger 2D list
        }
        else //other data
        {
            data[data.Count].Add(list[i]); //put other data into the most recent list
        }
    }
}

您也不需要使用Regex,因为这是一项昂贵的操作。我建议将其替换为

if(list[i].Contains("Grid-ref"))

答案 2 :(得分:0)

首先,不要尝试同时进行文件读取和数据操作。首先读取文件,然后将其放入简单的字符串列表中,然后进行文件读取。然后,处理数据。我添加了评论,所以应该不言自明。

static void Main(string[] args)
{
    var lines = ReadFile("input.txt");

    List<List<string>> data = new List<List<string>>();
    var firstHeader = false;
    foreach (var line in lines)
    {
        if (!firstHeader && line.StartsWith("Grid-ref="))
        {
            // Found the first header
            firstHeader = true;
            // Let's create a new list and add the header.
            var newList = new List<string> { line };
            data.Add(newList);
        }
        else if (firstHeader && !line.StartsWith("Grid-ref="))
        {
            // Now we're at the number lines to its corresponding list.
            data.Last<List<string>>().Add(line);
        }
        else if (firstHeader && line.StartsWith("Grid-ref="))
        {
            // Found the next header.
            // So we create next list and add the header.
            var newList = new List<string> { line };
            data.Add(newList);
        }
    }

    Console.ReadLine();
}

private static List<string> ReadFile(string file)
{
    var list = new List<string>();

    using (var sr = new StreamReader(file))
    {
        while (!sr.EndOfStream)
        {
            list.Add(sr.ReadLine());
        }
    }

    return list;
}

data的结尾如下。

enter image description here