我正在尝试使用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”的新行时创建新列表的帮助。
答案 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
的结尾如下。