2015-02-06 1 views
0

다음 코드는 CSV를 XML로 변환하는 코드입니다.csv to xml 및 lambda expressions

var xml = new XElement("root", 
     lines.Where((line, index) => index > 0).Select(line => new XElement("TEST", 
     line.Split(',').Select((column, index) => new XElement(headers[index], column))))) 

여기에 큰 그림이 있습니다. 마찬가지로 각 줄마다 무엇을하는지 알지만 왜 (선, 색인) 같은 부분이 사용되는지 이해하지 못합니다. 이것은 인덱스> 0 일 때 라인이 각각의 값으로 설정된다는 것을 의미합니까?

누군가 내게 이것을 부러 뜨릴 수 있다면 고맙겠습니다. 람다 표현식을 사용하지 않으면 멋질 것입니다.

var xml = new XElement("root", 
    lines.Where((line, index) => index > 0) // Skips first line 
     .Select(line => new XElement("TEST", 
      line.Split(',') 
       .Select((column, index) => new XElement(headers[index], column))))) 

Visual Studio에서 아마 new XElement("TEST") 같은 줄에 line.Split을 가하고, 더 수평 공간을 사용합니다 : 당신이 더 명확 들여 경우

답변

2

첫째, 정말 도움이 .

이제 (value, index)가 항목 당 두 가지 정보 수신 등 람다 복용 임의 Where 또는 Select 호 :

  • 인덱스 시퀀스

그래서 .Where((line, index) => index > 0 내의 값 자체 그냥 "첫 줄 무시"를 의미합니다. .Skip(1)으로 더 명확하게 쓰여질 것입니다.

다음으로 .Select((column, index) => new XElement(headers[index], column))은 각 열을 가져와 해당 헤더를 요소 이름으로하고 값으로 column을 만듭니다. 개인적으로, 나는 떠나, Zip를 사용하여이 쓰기 것 : system.xml.xmlexception '=':

var xml = new XElement("root", 
    lines.Skip(1) 
     .Select(line => new XElement("TEST", 
      line.Split(',') 
       .Zip(headers, (value, header) => new XElement(header, value))))) 
+0

나는 "DATA = NITSService"라는 이름의 열 머리글에서 하나의 열이있는 경우, 그것은 말에서 오류가 발생합니다 문자 16 진수 값 0x3a는 이름에 포함될 수 없습니다. 어떻게 제거하나요? – user2697903

+0

실제로 문자열에서 = 기호를 제거했습니다. 하지만이 일을하는 또 다른 방법을 알고 있다면 알려 주시기 바랍니다. – user2697903

+1

@ user2697903 : 글쎄, 그건 그냥 잘못된 XML이야 ... 당신은 단순히 XML 요소 또는 속성 이름'='를 포함 할 수 없습니다. –