2009-09-27 4 views
1

시작 중에 읽는 구성 파일이 매우 느슨하게 정의 된 응용 프로그램을 작성하고 있습니다. 이 파일은 구문 분석하기 쉽고 다음과 같이 보입니다.느슨하게 정의 된 파일 확인

tag1 = value1 
tag2 = value2 
tag3 = value3 
tag4 = value4 

태그 및 값은 사용자가 구성하고자하는 정보입니다. 앞에서 말했듯이 파일은 느슨하게 정의됩니다. 일명 필드의 일부 또는 전부를 요구하지는 않으며 값은 특정 순서 일 필요가 없습니다. 유일한 실제 규칙은 위 형식이어야하며 인식하지 못하는 태그는 무시됩니다.

위의 제약 조건을 염두에두고 파싱하는 동안 파일이 유효한지 확인하는 좋은 방법이 있습니까? .NET 런타임의 C# 2.0.x 버전을 개발 중입니다. 고맙습니다.

답변

3

(당신이 약간 파일 레이아웃을 변경할 때를 위해 일반적으로 좋은 연습 어쨌든) 단지를 찾아 다음 상단

#footype=1 

그리고의 버전을 배치 할 수 있습니다 정규 표현식을 사용하여 사전에 파일. 파일을 읽기 전에 지원되는 모든 키의 기본값을 사전에 추가 할 수 있습니다. 이렇게하면 파일에있는 키와 관계없이 일관된 키 세트가있는 사전을 얻을 수 있습니다. 이 경우 지원되지 않는 키를보고하는 파일을 읽을 때 지원되는 키 목록을 추가하고이 목록에 대한 모든 키를 확인하는 것이 좋습니다.

const String fileName = @"foo.ini"; 

const String entryExpression = @"^\s*(?<key>[a-zA-Z][a-zA-Z0-9]*)\s*=" + 
           @"\s*(?<value>[a-zA-Z][a-zA-Z0-9]*)\s*$"; 

Dictionary<String,String> entries = new Dictionary<String, String>(); 

foreach (String line in File.ReadAllLines(fileName)) 
{ 
    Match match = Regex.Match(line, entryExpression); 

    if (match.Success) 
    { 
     String key = match.Groups["key"].Value; 
     String value = match.Groups["value"].Value; 

     if (entries.ContainsKey(key)) 
     { 
      Console.WriteLine("Overwriting the key '{0}'.", key); 
     } 

     entries[key] = value; 
    } 
    else 
    { 
     Console.WriteLine("Detected malformed entry '{0}'.", line); 
    } 
} 
+0

나는 당신의 스타일을 좋아한다. Regex ++! –

1

왜 신경 써야합니까?

귀하는 이미 유효하지 않은 것을 무시한다고 말한 것입니다.

각 행에 ' = '을 검색 할 수 있지만 잘못된 파일을 갖는 데 드는 비용이 들지 않는다면 약간의 낭비가되는 것 같습니다.

양자 택일로, 당신은 내가 구문 분석 제안

0

임의의 관찰; 형식이 파이썬에 전달 될 것입니다. 따라서 기존 코드를 사용하고 더 많은 유연성을 제공하려면 IronPython을 포함시키고이를 사용하여 구성 파일을 구문 분석 (실행)하십시오. 이렇게하면 오류에 대해 알려주고 (성공시) 조회를 통해 값을 사용할 수 있도록해야합니다.

아마 실제로 과장은 가능하지만 실제로는 유연한 구성 스크립트 (DSL)가 파이썬의 장점입니다.

+3

타사에서이 구성을 작성하는 경우 완전히 현명하지 않습니다 (검증하는 경우에만 사용할 수 있음). 이와 같은 컴파일러를 임베드하면 효과적으로 앱의 컨텍스트에 침입하여 작업을 수행 할 수 있습니다. –

+0

설정 파일을 ..... 어떻게 든 나에게 나쁜 생각처럼 들리네. – mpen

+0

또한 완전히 미치지도 않습니다. 물론 전례가 없습니다. 모든 것이 당신이 입력을 얼마나 신뢰하는지에 달려 있습니다. 원하는 경우 app.config를 악용하여 매우 미친 짓을 할 수 있습니다. 구성을 제어 할 수 있으면 보호하려는 시스템보다 이미 강력합니다 ... –

관련 문제