2014-03-04 2 views
0

클래스의 목록으로 분할하고자하는 데이터 문자열을 가지고 모든 데이터를 생성자의 여러 속성으로 구문 분석합니다. 각 블록은 STX 문자로 시작하고 문자열 "PLC"로 끝납니다 (나는 왜 공급 업체가 ETX를 사용하지 않았는지 알지 못합니다)문자열을 목록으로 분할하기 (Of T)

문자열 datastream을 취하는 어떤 것이 기본적으로 문자열 "PLC"

STX1;0;0;0;0;1;0;0;0;0;0;+3272;-2145;+3273;-2145;PLC\r\nSTX1;0;0;0;0;1;0;0;0;0;0;+3276;-2145;+3272;-2145;PLC\r\nSTX1;0;0;0;0;1;0;0;0;0;0;+3281;-2145;+3272;-2145;PLC\r\n 

및() dataclass의 목록에 세 가지 항목을 초래할 것 : 그것을 유지)와() dataClass의 데이터 목록에 넣는다

데이터 스트림은 다음과 같습니다

STX1;0;0;0;0;1;0;0;0;0;0;+3272;-2145;+3273;-2145;PLC 
STX1;0;0;0;0;1;0;0;0;0;0;+3276;-2145;+3272;-2145;PLC 
STX1;0;0;0;0;1;0;0;0;0;0;+3281;-2145;+3272;-2145;PLC 

나는 보았고 일반적으로 문자열 분리에 관한 많은 정보를 찾았지만 클래스 나 목록에 넣는 것에 대해서는 아무것도 발견하지 못했습니다. 난 그냥 같은 것을 할 수있는 확신 :

dim datalist as list(of dataclass) 
dim splitdata() as string = datastream.split("PLC") 
for each data as string in splitdata 
    datalist.Add(new dataclass(data)) 
next 

하지만 난 아마 정규 표현식 또는 LINQ를 사용하지만 나도 정말 familary 아니에요 (더 efficant 방법이있을거야

감사한다. ! 전진

+1

당신이 원하는 객체의 입력 문자열과 출력을 가지고 있다면 도움이 될 것입니다. – Magnus

+0

요청한 정보를 추가했습니다. – BinaryDuck

답변

0

예, 정규 표현식은 잘 할 것 조각에 데이터를 분할하는 당신이 보여

Imports System.Text.RegularExpressions 

Module Module1 

    Sub Main() 
     Dim s = "STX;1;0;0;0;0;1;0;0;0;0;0;+3272;-2145;+3273;-2145;PLC\r\nSTX;1;0;0;0;0;1;0;0;0;0;0;+3276;-2145;+3272;-2145;PLC\r\nSTX;1;0;0;0;0;1;0;0;0;0;0;+3281;-2145;+3272;-2145;PLC" 
     Dim re As New Regex("(STX;.*?;PLC)") 

     Dim matches = re.Matches(s) 

     If matches.Count > 0 Then 
      For i = 0 To matches.Count - 1 
       Console.WriteLine(matches(i).Value) 
       'TODO: do whatever is required with matches(i) 
      Next 
     End If 

     Console.ReadLine() 

    End Sub 

End Module 

출력을 :

,369 위의 정규식에서
STX;1;0;0;0;0;1;0;0;0;0;0;+3272;-2145;+3273;-2145;PLC 
STX;1;0;0;0;0;1;0;0;0;0;0;+3276;-2145;+3272;-2145;PLC 
STX;1;0;0;0;0;1;0;0;0;0;0;+3281;-2145;+3272;-2145;PLC 

1,363,210가, 괄호 그룹을 캡처, 다음 텍스트까지 제로 또는-번 이상 (*)는 텍스트 부분 STX;;PLC이 일치하는 리터럴, 그리고 .*? 아무것도 (.)을 일치합니다. ?은 "비 탐욕적"입니다. 욕심이 많았다면 최종본 ;PLC까지 모든 것을 일치시킬 수 있었고 결국 전체 경기가 끝나게 될 것입니다. (가) 위의 불평, 그래서 만약

Module Module1 

    Sub Main() 
     Dim s As String = "STX;1;0;0;0;0;1;0;0;0;0;0;+3272;-2145;+3273;-2145;PLC\r\nSTX;1;0;0;0;0;1;0;0;0;0;0;+3276;-2145;+3272;-2145;PLC\r\nSTX;1;0;0;0;0;1;0;0;0;0;0;+3281;-2145;+3272;-2145;PLC" 
     ' transform the test string to its actual form 
     s = s.Replace("\r\n", vbCrLf) 

     ' split it into the required parts as an array 
     Dim parts() As String = s.Split({vbCrLf}, StringSplitOptions.RemoveEmptyEntries) 

     ' show the split worked as desired 
     For i = 0 To parts.Length - 1 
      Console.WriteLine(String.Format("Part {0}: {1}", i, parts(i))) 
      'TODO: do something with parts(i) 
     Next 

     Console.ReadLine() 

    End Sub 

End Module 

당신은 당신이 사용하는 VS 버전을 언급하지 않았다 :

귀하의 의견에 비추어 편집

, 나는 String.Split Method (String(), StringSplitOptions) 오버로드를 사용하는 것이 좋습니다 약

Dim parts() As String = s.Split({vbCrLf}, StringSplitOptions.RemoveEmptyEntries) 

다음

로 바꾸십시오. 데이터가 파일에서 읽을되는 경우
Dim splitAt() As String = {VbCrLf} 
Dim parts() As String = s.Split(splitAt, StringSplitOptions.RemoveEmptyEntries) 

또한는, 당신은 한 번에 배열로 모든 라인을 잡아하는 File.ReadAllLines Method를 사용할 수 있습니다.

+0

이 작품! 그러나 나는 텍스트의 다른 블록들 사이에 추가적으로 \ r \ n이 있음을 깨달았다. 그래서 나는 실제로 그것에 string.split 할 수 있습니다. 그래서 호기심에서 6 ~ 8 개의 스레드가 한꺼번에 처리하므로 어떤 방법이 더 효율적인지 알 수 있습니까?내 추측은 string.split() 백그라운드에서 비슷한 자동으로 않습니다. Howerer 만약 차이가 없다면 나는 당신의 방법을 단지 멋지게 사용할 것입니다! (나는 당신을 업 그레 이드 하겠지만 나는 그들을 얻으면 충분한 평판 포인트를 얻지 못하고 내가 돌아와서 그렇게 할 것입니다) – BinaryDuck

+0

@ BinaryDuck "\ r \ n"이라고 쓰면, 네 개의 별개의 문자 '\ r \ n'을 의미합니다. 나는 String.Split이 더 빠를 것이라고 생각하지만 실제로 데이터를 테스트 할 때까지는 알 수 없다. –

+0

사실 나는 그 두 가지만의 아스키 문자 표현을 의미했습니다. – BinaryDuck

관련 문제