2014-10-31 4 views
1

나는 정규식 패턴과 일치하며 원하는 출력을 생성하기 위해 Linq를 디자인하는 데 어려움을 겪고 있습니다.Linq with Regex

데이터가 고정 길이는이 경우

길이이다 1231234512341234567 : 3, 5, 4, 7

사용할 정규식 패턴이다 (.{3})(.{5})(.{4})(.{7})

이 모두 작동 전혀 문제 및 패턴 매칭 결과는 그러나 예상대로 원하는 출력은 다소 어려움이 입증됩니다. 사실, 필자는 피벗 쿼리를 제외하고 SQL 용어로 무엇이 불릴 지 확신하지 못합니다.

field1:value1;value2;value3;valueN;field2:value2;value3;valueN; 

아래의 LINQ 표현을 사용하여, 나는이 필드 1-값 1, FIELD2-값 2를 얻을 수있었습니다 : 원하는 출력은 지정된 위치에 각 그룹에서 모든 값을 예를 들어, 그래서 그들을 연결하는 것입니다 , 등 ...

var matches = Regex.Matches(data, re).Cast<Match>(); 

var xmlResults = from m in matches 
       from e in elements 
       select string.Format("<{0}>{1}</{0}>", e.Name, m.Groups[e.Ordinal].Value); 

하지만 난 그렇게에 위치 2에서 다음 요소의 서수 사용하여 "그룹"에서 모든 값을 위치 1에서 모든 값을 얻을하는 방법을 알아낼 수 없습니다.

이 예제의 "요소"는 필드 이름 및 순서 위치 모음입니다 (1에서 시작). 이 다음과 같아야 :

public class Element 
{ 
    public string Name { get; set; } 
    public int Ordinal { get; set; } 
} 

var elements = new List<Element>{ 
    new Element { Name="Field1", Ordinal=1 }, 
    new Element { Name="Field2", Ordinal=2 } 
}; 

나는 여러 가지의 LINQ 표현의 무리를 검토하고 일부 피벗 타입의 LINQ 식을 파고,하지만 그들 중 누구도 내게 가까이를 얻을 것 - 그들은 모두 조인 연산자를 사용하는 I 가능하다고 생각하지 마십시오.

누구든지이 Linq 만드는 법을 알고 있습니까?

답변

1

에만 elements에서 선택 쿼리를 변경하여이 작업을 수행 할 수 있어야하고,이 같은 string.Join을 통해 matches 초래한다 :

// Use ToList to avoid iterating matches multiple times 
var matches = Regex.Matches(data, re).Cast<Match>().ToList(); 
// For each element, join all matches, and pull in the value for e.Ordinal 
var xmlResults = elements.Select(e => 
    string.Format(
     "<{0}>{1}</{0}>" 
    , e.Name 
    , string.Join(";", matches.Select(m => m.Groups[e.Ordinal].Value)) 
    ); 

참고 :이 XML 포맷의 가장 좋은 방법이 아니다 . LINQ2XML과 같이 XML을 만드는 데 .NET 라이브러리 중 하나를 사용하는 것이 좋습니다.

+0

감사합니다. –

+0

가깝습니다. 첫 번째 SelectMany가 올바른 경로에있는 것처럼 보입니다. 그러나 요소 이름을 한 번에 여러 값으로 출력하려면 어떻게해야합니까? 또한 XML을 출력하지 않는다는 점에 유의하십시오. 이는 독점적 인 형식입니다. –

+0

@ChrisGessler 별도의 태그에 넣고 싶지 않으면'SelectMany'가 필요하지 않습니다.'string.Format'과'string.Join'을 사용하는 간단한'Select'에서 바로 연결할 수 있습니다. 업데이트). – dasblinkenlight