2010-02-10 1 views
50

쉼표로 구분 된 문자열 목록을 루프 할 수있는 일종의 개체로 구문 분석하여 개별 값에 쉽게 액세스 할 수있는 가장 쉬운 방법은 무엇입니까?쉼표로 구분 된 문자열을 특정 유형의 개체로 구문 분석하는 가장 쉬운 방법은 개별 값에 액세스하기 위해 반복 할 수 있습니까?

예를 들어 문자열 : "0, 10, 20, 30, 100, 200"

는 전 C#을 조금 새로운, 그래서이 같은 간단한 질문을 용서해. 감사.

+0

re : 내 대답 - 실제로이 값을 숫자로 처리하는 경우 관심이 있다면 결함 허용 방식으로 파싱하기위한 추가 전략이 있습니다. 나는 그것들을 추가하기 시작했다. 그러나 실제로 그것이 너무 많은 정보라고 느꼈다. –

+0

실제로 네, #s가 필요 했었지만 지금 구현했습니다. 코드를 수행 한 후 쉽습니다. 모든 것이 잘 작동합니다. 감사! – ycomp

답변

123

이와 개는있다 - 그러나 궁극적으로 가장 간단한 방법은 뉴 경우

string s = [yourlongstring]; 
string[] values = s.Split(','); 

을 사용하는 것입니다 쉼표 항목의 mber는 중요하지 않습니다, 당신은 당신이 생각

string[] values = s.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

한 가지를 사용할 수있는 '빈'값을 제거하려면 -이 전에와 문자열 후 공백을 유지합니다. 당신은 닷넷 3.5을 사용하는 경우의

string[] values = s.Split(',').Select(sValue => sValue.Trim()).ToArray(); 

를 당신은 소스 파일의 상단에 System.Linq 사용 선언을 : 당신은 그것을 해결하기 위해 Linq에 마법의 비트를 사용할 수 있습니다.

+0

공백에 대처할 수있는 정규식 솔루션도 사용할 수 있습니다. 그러나 이것이 가장 직접적인 접근 방법입니다. @ Andras의 덧글에 –

+1

가 추가되었습니다.나는 또한 정규 표현식을 사용하여 각 값이 숫자이고 다른 것들을 제거하도록 할 것이다. 무늬? ' "(? \ d +)"'이면 각 Match.Groups [ "value"]'에서 얻을 수 있습니다. 그렇게하는 동안 정수로 변환 할 수 있습니다. –

+1

필자는 이들 중 일부를 List userIds = usersList.Split (',')으로 만들었습니다. (sValue => long.Parse (sValue.Trim())). – Manish

17
var stringToSplit = "0, 10, 20, 30, 100, 200"; 

// To parse your string 
    var elements = test.Split(new[] 
    { ',' }, System.StringSplitOptions.RemoveEmptyEntries); 

// To Loop through 
    foreach (string items in elements) 
    { 
     // enjoy 
    } 
+1

좋은 간단한 해결책. –

6

Linq를 사용하면 매우 빠르고 쉬운 방법입니다.

string mystring = "0, 10, 20, 30, 100, 200"; 

var query = from val in mystring.Split(',') 
      select int.Parse(val); 
foreach (int num in query) 
{ 
    Console.WriteLine(num); 
} 
+0

try'int.Parse (val.Trim()) –

+3

Linq를 사용하는 데 약간의 과잉 사용이되지는 않습니까? .split()는 루프 할 수있는 배열을 반환합니다. Linq의 복잡성을 추가하고 있습니다. 무엇보다도 가독성이 떨어집니다. –

+0

하지만 무슨 일이 일어나고 있는지 이해하기 쉽고 컴파일러는 lambda-querys를 사용하는 것처럼 표현식 트리와 같은 방식으로 쿼리를 변환합니다. – martin

4

패턴이 모든 비 숫자 문자와 일치합니다. 이렇게하면 음수가 아닌 정수로 제한되지만, 예를 들어 충분하지 않을 수도 있습니다.

string input = "0, 10, 20, 30, 100, 200"; 
Regex.Split(input, @"\D+"); 
2

때로는 열이 같은 자체 내에서 쉼표해야합니다 :

"일부 항목", "또 다른 항목을" "또, 또 하나 개의 항목"이러한 경우

에 분할 "," 일부 열이 깨질 수 있습니다. 어쩌면 더 쉬운 방법 일 수도 있지만 보너스로 쉼표 뒤에 공백을 처리하고 IList를 반환하는 자체 메서드를 만들었습니다.

private IList<string> GetColumns(string columns) 
{ 
    IList<string> list = new List<string>(); 

    if (!string.IsNullOrWhiteSpace(columns)) 
    { 
     if (columns[0] != '\"') 
     { 
      // treat as just one item 
      list.Add(columns); 
     } 
     else 
     { 
      bool gettingItemName = true; 
      bool justChanged = false; 
      string itemName = string.Empty; 

      for (int index = 1; index < columns.Length; index++) 
      { 
       justChanged = false; 
       if (subIndustries[index] == '\"') 
       { 
        gettingItemName = !gettingItemName; 
        justChanged = true; 
       } 

       if ((gettingItemName == false) && 
       (justChanged == true)) 
       { 
        list.Add(itemName); 
        itemName = string.Empty; 
        justChanged = false; 
       } 

       if ((gettingItemName == true) && (justChanged == false)) 
       { 
        itemName += columns[index]; 
       } 
      } 
     } 
    } 

    return list; 
} 
관련 문제