2017-02-28 1 views
1
로 시작하는 문자열

C#을 처음 사용했습니다. 나는 순간도 BRD1, MAT2, INFO4 # streamreader

100 - 2017.02.24-12.26 - SaraH --> to label1 
HDF-101D-BL3M,HDF 101D white-3mm --> to label2 
2         --> to label3 

후, 난 단지 우측 라인을 선택하는 시도가되는 문자열을 얻을 필요가

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 

: 나는 StreamReader 클래스를 사용하여 텍스트 파일을 구문 분석하려고 그 다음에 나눕니다.

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(','); 
       } 
      } 
     } 
    } 
} 
+2

'line.StartsWith (word)'? – Pikoh

+0

분할 대신에'var restOfLine = line.Substring (word.Length, line.length - word.length); '할 수 있습니다.'당신이 ','에 의존하지 않고 나머지를 나누지 않을 것입니다. 라인의 배열로. – EluciusFTW

답변

1

그것은 훨씬 더 효율적인 것 한 번에 전체 텍스트를 구문 분석하려면 regular expressions을 사용하십시오.

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); 
    } 
} 
+0

이 작업은 문제가 없지만 라인 MAT2에서 줄을 모두 넣고 쉼표 사이의 문자열도 필요합니다. DF-101D-BL3M, HDF 101D 흰색 -3mm – nordscan

+0

항상 첫 번째 두 단어가 " MAT2 후에 쉼표? – Aboc

+0

예, 모두 (BRD1, MAT2, INFO4) 쉼표로 구분 된 "두 번째 문자열"만 필요합니다. 위의 wrotte beffore (label1,2,3은 어디에 있습니까?)와 같은 – nordscan

1

당신은 String.StartsWith 사용할 수 있습니다

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

가 추가 단순화, 당신은 LINQ 방법 Enumerable.Any으로 forach 루프를 방지 할 수 있습니다

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