2016-10-02 1 views
0

"두 문자열 사이의 특정 문자열을 찾아 목록에 넣기"에 대한 질문이 있습니다.C# 두 문자열 사이의 특정 문자열을 목록으로 가져옵니다. <string>

-begin- 
code:[264] 
Name:[1] 
Name:[2] 
Name:[3] 
-end- 
code:[264] 
Name:[1] 
Name:[4] 
code:[264] 
Name:[6] 
-begin- 
Name:[6] 
code:[264] 
Name:[7] 
Name:[8] 
Name:[1] 
-end- 

내가 문자열을 분할 할 :

은 그 같은 문자열이 "이름" "-begin-"에서 "- 끝 -"사이에 아래와 같은 목록으로,

list<1> 
Name:[1] 
Name:[2] 
Name:[3] 
list<2> 
Name:[6] 
Name:[7] 
Name:[8] 
Name:[1] 

이제 "-begin-"에서 "-end-"사이의 텍스트 만 목록으로 나눌 수 있습니다.

int first = 0; 
int last = 0; 
int number = 0; 
int start = 0; 
    do { 
     first = text.IndexOf("-begin-", start); 
     last = text.IndexOf("-begin-", first + 1); 
     if (first >= 0 && last >= 0) 
      { 
       number = (last - first); 
       AVPline.Add(text.Substring(first,number).Trim()); 
       start = last + 1; 
      } 
    } while (position > 0); 

내가 문자열을 분할 할 생각이 없다 "이름 :"을 "-begin-"사이의 분할 텍스트 뒤에 "- 끝".

누군가 나를 도와 줄 수 있습니까?

고맙습니다.

+0

"Name : [3]"행에 Split (':') [1]을 사용하면 [3] 부분을 가져올 수 있습니다. 네가 묻고있는거야? –

+0

우리는 여전히 충분한 정보가 없습니다. 예를 들어''-begin-''과' "-end-"'시퀀스는 어떤 식 으로든'Name' 필드의 위치와 일치하지 않는 것처럼 보입니다. 일부'Name' 필드는 시작/끝 블록 안에 있고, 다른 것들은 그렇지 않습니다. 그것은 다소 우연합니다. 샘플 데이터가 정확하다면 간단히 앉아서 자신 만의 상세한 파싱 로직을 작성해야합니다. 파싱 로직 이외에 기술적 인 문제는 없습니다. – code4life

답변

1

String.Split은 문자열을 배열 하위 문자열로 구문 분석합니다. 그런 다음 하위 문자열을 처리합니다.

string[] parseStr = text.Split('\n'); 
+0

jim31415 고맙습니다. 코드를 사용하면 문자열을 각 행으로 쉽게 나눌 수 있습니다. –

1

당신은 열거하고 yield return의 많은 청소 및 유지 관리 코드를 만들어 사용 얻을 수 있습니다 모든

먼저, 오른쪽 서명을받을 수 있습니다. 입력 문자열에서 목록 모음을 만들어야합니다. public static IEnumerable<IList<string>> ProcessText(string input)가 올바르게 표시됩니다.

이제 우리의 삶을 편하게 만들 수 있습니다.

var lines = input.Split(new[] { Environment.NewLine }); 

는 이제 라인을 통해 반복 할 수 있지만,이 작업을 수행하기 위해 foreach를 사용하지 수 있습니다 : 우선, 라인 입력 문자열을 분할 할 수 있습니다. 수 있습니다 조금 전에했던 얻을 및 비트에 명확하게됩니다 이유는 직접 열거를 사용

using (var enumerator = lines.GetEnumerator()) 
{ 
    while (enumerator.MoveNext() 
    { 
    } 
} 

자, 이제 우리가 각각의 하위 목록의 시작을 찾아 적절하게 구축해야합니다. Thats easy :

while (enumerator.MoveNext() 
{ 
    if (enumerator.Current == "-begin-" 
     yield return createSubList(enumerator).ToList(); 
} 

이제 열거 형을 직접 사용하는 이유를 알 수 있습니다. 이렇게하면 입력 텍스트에있는 위치를 쉽게 추적 할 수있는 다른 메서드를 호출 할 수 있습니다.

static IEnumerable<string> createSubList(IEnumerator<string> enumerator) 
{ 
    while (enumerator.MoveNext() 
    { 
     if (enumerator.Current == "-end-") 
     { 
      yield break; 
     } 

     if (!enumerator.Current.StartsWith(...whatever strings you want to ignore)) 
     { 
      yield return enumerator.Current; 
     }  
    } 
} 

이제 끝났습니다! 모두 함께 정리해 보겠습니다.

public IEnumerable<IList<string>> ProcessText(string input) 
{ 
    var lines = input.Split(new[] { Environment.NewLine }); 

    using (var enumerator = lines.GetEnumerator()) 
    { 
     while (enumerator.MoveNext() 
     { 
      if (enumerator.Current == "-begin-" 
       yield return createSubList(enumerator).ToList(); 
     } 
    } 
} 

private static IEnumerable<string> createSubList(IEnumerator<string> enumerator) 
{ 
    while (enumerator.MoveNext() 
    { 
     if (enumerator.Current == "-end-") 
     { 
      yield break; 
     } 

     if (!enumerator.Current.StartsWith(...whatever strings you want to ignore)) 
     { 
      yield return enumerator.Current; 
     }  
    } 
} 
+1

직접 열거자를 사용하십시오! 그 +1! –

+0

OP의 샘플 텍스트로 가정 할 때 입력 문자열에 NewLine이 포함 된 경우에만 작동합니다. 귀하의 솔루션은 좋아 보이지만 OP가 너무 복잡하기 때문에 두려워합니다. –

+0

고맙습니다 InBetween, 코드를 사용한 후에 프로그램의이 부분을 전달할 수 있지만 더 많은 질문이 있습니다. 행 사이에 문자열을 찾고 싶다면 '열거 자 .Current.StartsWith'를 사용할 수 없습니다.'열거 자 .Current.Indexof' 또는 아닙니다? –

0

시도해 보는 것이 너무 먼 해결책이 아닙니다.
휴대 전화 만 가지고 있으므로 테스트 된 코드를 제공 할 수 없습니다. 하지만 내 조언은 다음과 같습니다.

  • 문자열 목록이 필요합니다. 배열 목록이 얼마나 커질 지 모르기 때문에 문자열 목록을 만듭니다. 끝에있는 목록에서 쉽게 배열을 얻을 수 있습니다.
  • 루프가 필요합니다. 당신은 이미 그것을 가지고 있습니다.루프 내부에서
  • 시작과 끝을 찾으십시오. 거의 완료했습니다. 당신은 -begin- 검색해야하고
  • -end-는 내부 (중첩) 루프 내에서 -begin--end- 및 프로세스를 사이에 원하는 데이터를 가지고

중첩 루프 :

  • 문자열
  • 의 목록을 작성
  • 데이터를 가져 와서 바깥 쪽 루프와 같은 방식으로 Name 및 종료 ]으로 검색하십시오.
  • 발견 된 요소를 목록에 추가하십시오.

중첩 루프 후, 여전히 외부 루프 내부 :

  • 문자열 목록리스트에 방금 채운 문자열의 목록을 추가합니다.

외부 루프의 끝.

외부 루프에 유효한 조건을 사용해야합니다. 당신의 견본에서는 결코 '위치'를 설정하지 않습니다.

+0

컨셉이 매우 명확하고 이해하기 쉽습니다. –