以开头的c#streamreader字符串

以开头的c#streamreader字符串,c#,streamreader,C#,Streamreader,我是C#的新手。我尝试使用StreamReader类解析文本文件: 1,0 BRD1,100 - 2017.02.24-12.26 - SaraH BRD2,HDF-101D-BL3M,2800,2070,100,0,3,HDF-101D-BL3M,,,0,,0,, XBRD1,100 - 2017.02.24-12.26 - SaraH XBRD2,100 - 2017.02.24-12.26 - SaraH/0001,2800,270.8,1,0,3,HDF-101D-BL3M,,,0,,1

我是C#的新手。我尝试使用
StreamReader
类解析文本文件:

1,0
BRD1,100 - 2017.02.24-12.26 - SaraH
BRD2,HDF-101D-BL3M,2800,2070,100,0,3,HDF-101D-BL3M,,,0,,0,,
XBRD1,100 - 2017.02.24-12.26 - SaraH
XBRD2,100 - 2017.02.24-12.26 - SaraH/0001,2800,270.8,1,0,3,HDF-101D-BL3M,,,0,,1,,

PNL1,100 - 2017.02.24-12.26 - SaraH
PNL2,1,HDF-101D-BL3M,1130,295,2,0,,,,,1,0,0,PIL_100_1130x295.bmp
PRM2,21,0,50,50,0,0,0,80,80,80
PRM3,18,0,0,15,15,15,75,1,200,2,350,3,650,4,1050,5,0,6,2600,7,4200,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18

MAT2,HDF-101D-BL3M,HDF 101D white h-3mm,3,0,2,4.8,4.8,4.8,0,0,0,15,15,15,15,5,5,5,0,250,250,0.06,0,60,2200,0,0,0,0,0,1,1,0,0,0,2,0,0,0,1,30,30,30,17,NTMDPI,0,19,9.51,0.03,2,11.59,0.03,2,2,0,0:11,,,,,,,,,,RGB(255:255:255),

PTN2,1,,1,1,4:38,0:04,5,11,0,0
PTNR,(((5!),X2),((7!),(9),(9),(9)),(3!,2!))

INFO1,100 - 2017.02.24-12.26 - SaraH,100 - 2017.02.24-12.26 - SaraH,standart15,HP30
INFO4,2
CHK1,9183
我需要在
BRD1、MAT2、INFO4之后找到一个字符串
也

目前,我尝试只选择正确的行,然后拆分

因为
if(line.Contains(word))
选择包含此字符串的所有行,所以我需要类似
line.BeginWith(word)
的内容

另外,如果有人可以帮助我,或者可以介绍我,如果有更好的方法来获得这个结果

private void OnChanged(object source, FileSystemEventArgs e)
{
    string line;
    string[] words = { "BRD1", "MAT2", "INFO4"};
    // Read the file and display it line by line.
    using (var file = new System.IO.StreamReader(e.FullPath))
    {
        while ((line = file.ReadLine()) != null)
        {
            foreach (string word in words)
            {
                if (line.Contains(word))
                {
                    string[] fields = line.Split(',');
                }
            }
        }
    }
}

您可以使用
String.StartsWith

foreach (string word in words)
{
    if (line.StartsWith(word))
    {
        string[] fields = line.Split(',');
    }
}
作为额外的简化,您可以使用LINQ方法
Enumerable避免forach
循环。任何

if (words.Any(word => line.StartsWith(word)))
{
    string[] fields = line.Split(',');
}

这将是一种更有效的方法,使用它可以立即解析全文

List<string> labels = new List<string>();
Regex regex = new Regex(@"\r\n(BRD1|MAT2|INFO4),([^(,|\r\n)]*,?[^(,|\r\n)]*)");
using (var file = new System.IO.StreamReader(e.FullPath))
{
    foreach (Match match in regex.Matches(file.ReadToEnd()))
    {
        labels.Add(match.Groups[2].Value);
    }
}
列表标签=新列表();
Regex Regex=new Regex(@“\r\n(BRD1|MAT2|INFO4),([^(,|\r\n)]*,?[^(,|\r\n)]*);
使用(var file=new System.IO.StreamReader(e.FullPath))
{
foreach(在regex.Matches(file.ReadToEnd())中匹配)
{
labels.Add(match.Groups[2].Value);
}
}

line.StartsWith(word)
?您还可以执行
var restOfLine=line.Substring(word.Length,line.Length-word.Length)而不是拆分操作这样你就不依赖于“,”了,而且你也不会将行的其余部分分割成一个数组。这很好,但是在第2行它把所有的内容都从行中放出来,我只需要逗号之间的字符串,也就是DF-101D-BL3M,HDF 101D-white-3MM,它是否总是在第2行后面用逗号分隔的前两个“单词”呢?是的,从所有(BRD1,MAT2,INFO4)我只需要用逗号分隔的“第二个字符串”。就像我之前写的(标签1,2,3在哪里),我编辑了答案。正则表达式现在最多使用标记后面的前两个单词。
List<string> labels = new List<string>();
Regex regex = new Regex(@"\r\n(BRD1|MAT2|INFO4),([^(,|\r\n)]*,?[^(,|\r\n)]*)");
using (var file = new System.IO.StreamReader(e.FullPath))
{
    foreach (Match match in regex.Matches(file.ReadToEnd()))
    {
        labels.Add(match.Groups[2].Value);
    }
}