C# 从文本文件中读取多行

C# 从文本文件中读取多行,c#,parsing,file-io,multiline,C#,Parsing,File Io,Multiline,我正在尝试读取文本文件中的多行。看起来是这样的: ############################################# B_ATTR 'MILLING_ORIGIN' 'MILLING 0 0.0 0' 3.635 0.405 B_ATTR 'DRILL_ORIGIN' '' 0.0 0.0 B_ATTR 'BOARD_ROUTING_OUTLINE' '' 0.0192 0.0885 0.0862 0.0215 3.84915 0.0215 - 3.9162 0.

我正在尝试读取文本文件中的多行。看起来是这样的:

#############################################
B_ATTR 'MILLING_ORIGIN' 'MILLING 0 0.0 0'  3.635 0.405
B_ATTR 'DRILL_ORIGIN' ''  0.0 0.0
B_ATTR 'BOARD_ROUTING_OUTLINE' ''  0.0192 0.0885 0.0862 0.0215 3.84915 0.0215 - 
3.9162 0.0885 3.9162 0.7018 3.8491 0.7689 3.6793 0.7689 3.65335 0.7715 3.6274 0.77935 - 
3.60355 0.7921 3.5826 0.8093 3.5654 0.83025 3.55265 0.8541 3.5448 0.88 3.5422 0.906 - 
3.5422 5.62345 3.54335 5.6408 3.54685 5.6585 3.55265 5.67565 3.56065 5.69185 3.57065 5.7069 - 
3.58255 5.7205 3.59615 5.73245 3.61065 5.7421 3.9162 5.91855 3.9162 6.2136 3.8491 6.2807 - 
0.0862 6.2807 0.0192 6.21365 0.0192 5.91855 0.32465 5.7421 0.33915 5.7324 0.3527 5.72045 - 
0.36465 5.7069 0.3747 5.6919 0.3827 5.67565 0.3885 5.65855 0.39205 5.64085 0.3932 5.62345 - 
0.3932 0.906 0.3906 0.88 0.38275 0.8541 0.37 0.83025 0.3528 0.8093 0.33185 0.7921 - 
0.308 0.77935 0.28205 0.7715 0.2561 0.7689 0.0862 0.7689 0.0192 0.7018
B_ATTR 'BOARD_PLACEMENT_OUTLINE' ''  0.0192 0.0885 0.0862 0.0215 3.84915 0.0215 - 
3.9162 0.0885 3.9162 0.7018 3.8491 0.7689 3.6793 0.7689 3.65335 0.7715 3.6274 0.77935 - 
3.60355 0.7921 3.5826 0.8093 3.5654 0.83025 3.55265 0.8541 3.5448 0.88 3.5422 0.906 - 
3.5422 5.62345 3.54335 5.6408 3.54685 5.6585 3.55265 5.67565 3.56065 5.69185 3
阅读将以“B_ATTR‘BOARD_ROUTING_OUTLINE’”开头的行开始,以“B_ATTR‘BOARD_PLACEMENT_OUTLINE’”开头的行结束。我写了这段代码,但不起作用。我无法摆脱一些空间

StreamReader reader = new StreamReader("neutral.txt");

        string lines = reader.ReadToEnd(); //Reading all lines.

        //Takes the lines I want.
        lines = lines.Substring(lines.IndexOf("B_ATTR 'BOARD_ROUTING_OUTLINE'"), lines.IndexOf("B_ATTR 'BOARD_PLACEMENT_OUTLINE'") - lines.IndexOf("B_ATTR 'BOARD_ROUTING_OUTLINE'"));

        //if the line contains "-" , replaces with " "(space).
        while (lines.Contains("-"))
            lines = Regex.Replace(lines, @"\-", " ");

        //if the line contains "  "(two spaces), replaces with " "(one space).
        while (lines.Contains("  "))
            lines = Regex.Replace(lines, @"\  ", " ");

        string[] items = lines.Split(' ');

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

        //Places all of the elements of items to list.
        foreach (var element in items)
            list.Add(element);


        //if the list contains any space , removes it.
        while (list.Contains(" "))
            list.Remove(" ");


        //Removes the elements I don't want.
        list.Remove("B_ATTR");
        list.Remove("'BOARD_ROUTING_OUTLINE'");
        list.Remove("''");
        list.Remove("B_ATTR");
        list.Remove("'BOARD_PLACEMENT_OUTLINE'");           

        string[,] array = new string[50, 2];

        string[] array2 = list.ToArray(); //Turns the list to array.

        int counter = 0;


        //Makes a rectangular array with 50 rows and 2 columns.
        for (int a = 0; a < 50; a++)
            for (int b = 0; b < 2; b++)
            {
                array[a, b] = array2[counter];
                counter++;                    
            }
StreamReader=newstreamreader(“neutral.txt”);
字符串行=reader.ReadToEnd()//读所有的行。
//照我说的做。
lines=lines.Substring(lines.IndexOf(“B_ATTR‘BOARD_ROUTING_OUTLINE’”),lines.IndexOf(“B_ATTR‘BOARD_PLACEMENT_OUTLINE’))-lines.IndexOf(“B_ATTR‘BOARD_ROUTING_OUTLINE’”);
//如果行包含“-”,则替换为“”(空格)。
while(行.包含(“-”)
lines=Regex.Replace(行,@“\-”,“”);
//如果行包含“”(两个空格),则替换为“”(一个空格)。
while(lines.Contains(“”)
lines=Regex.Replace(行,@“\”,“”);
字符串[]项=行。拆分(“”);
列表=新列表();
//将项目的所有元素放置到列表中。
foreach(项目中的var元素)
列表。添加(元素);
//如果列表包含任何空格,请将其删除。
while(list.Contains(“”)
列表。删除(“”);
//删除我不想要的元素。
列表。删除(“B_ATTR”);
列表。删除(“'BOARD\u ROUTING\u OUTLINE'”);
列表。删除(“删除”);
列表。删除(“B_ATTR”);
列表。删除(“'BOARD\u PLACEMENT\u OUTLINE'”);
字符串[,]数组=新字符串[50,2];
字符串[]array2=list.ToArray()//将列表转换为数组。
int计数器=0;
//创建一个包含50行和2列的矩形阵列。
对于(int a=0;a<50;a++)
对于(int b=0;b<2;b++)
{
数组[a,b]=数组2[计数器];
计数器++;
}
我实际上使用正则表达式来消除空格,但我不能消除行之间的空格和数组中的空格


你有什么建议吗?我做错了吗?

对于这样的操作,我更喜欢逐行读取文件:

while (!reader.EndOfStream)
{
    string line = reader.ReadLine();

    // parse values and add to list
}

您可以检查行的开始和结束标记,并在找到结束时退出循环。

对于此类操作,我更喜欢逐行读取文件:

while (!reader.EndOfStream)
{
    string line = reader.ReadLine();

    // parse values and add to list
}

您可以检查行的开始和结束标记,并在找到结束时退出循环。

您的
StreamReader缺少一条using语句,但我不想进行更正,而是将整个文件读取机制替换为

 string[] lines = File.ReadAllLines("C:\path\to\file.txt");

您的
StreamReader
缺少一条using语句,但与其进行更正,我只需将整个文件读取机制替换为

 string[] lines = File.ReadAllLines("C:\path\to\file.txt");
这个

//if the line contains "  "(two spaces), replaces with " "(one space).
while (lines.Contains("  "))
    lines = Regex.Replace(lines, @"\  ", " ");

string[] items = lines.Split(' ');
。。。可以替换为

string[] items = lines.Split(' ', StringSplitOptions.RemoveEmptyEntries);
。。。这会解决你的空间问题


有鉴于此,我将以不同的方式攻击它,并在逐行读取文件时填充对象的属性。这里有一个小片段(假设您只需要路由大纲):

var=false;
var routingOutline=新列表();
Func isDecimal=text=>
{
十进制d;
返回decimal.TryParse(文本,输出d);
};
foreach(File.ReadLines(“data.txt”)中的var行)
{
if(行包含(“线路板位置和轮廓”))
打破
if(行包含(“线路板布线轮廓”))
消费=真实;
如果(消耗)
{
变量outlineValues=行分割(“”)
.Where(isDecimal)
.Select(decimal.Parse);
routingOutline.AddRange(OutlineValue);
}
}

//if the line contains "  "(two spaces), replaces with " "(one space).
while (lines.Contains("  "))
    lines = Regex.Replace(lines, @"\  ", " ");

string[] items = lines.Split(' ');
。。。可以替换为

string[] items = lines.Split(' ', StringSplitOptions.RemoveEmptyEntries);
。。。这会解决你的空间问题


有鉴于此,我将以不同的方式攻击它,并在逐行读取文件时填充对象的属性。这里有一个小片段(假设您只需要路由大纲):

var=false;
var routingOutline=新列表();
Func isDecimal=text=>
{
十进制d;
返回decimal.TryParse(文本,输出d);
};
foreach(File.ReadLines(“data.txt”)中的var行)
{
if(行包含(“线路板位置和轮廓”))
打破
if(行包含(“线路板布线轮廓”))
消费=真实;
如果(消耗)
{
变量outlineValues=行分割(“”)
.Where(isDecimal)
.Select(decimal.Parse);
routingOutline.AddRange(OutlineValue);
}
}

如果要清除每个数组位置中的所有空格,可以按如下方式清除每个索引:

array[a,b]=Regex.Replace(array2[counter],@“\s”,”)


另一方面,您不需要在其他正则表达式模式中转义空格和破折号。

如果您试图清除每个数组位置中的所有空格,可以按如下方式清除每个索引:

array[a,b]=Regex.Replace(array2[counter],@“\s”,”)


另一方面,您不需要在其他正则表达式模式中转义空格和破折号。

如果使用File.ReadAllLines,您将首先准备好数组。您只需获取两个文本的
indexof
并将元素置于两者之间。我尝试了。我使用File.ReadAllLines阅读它,并使用“join”将它们变成一行字符串。然后我用“子字符串”来扮演我想要的角色。但它显示了一个错误。它说这行太长了,无法阅读。
它不起作用了
请以后,您需要更具描述性。这个描述对任何试图帮助你的人都是毫无用处的。为什么不起作用?你有编译错误吗?运行时错误?意外输出?你到底期望什么?你得到了什么?我说了,我无法摆脱