2012-06-30 1 views
0

C#을 사용하여 목표는 텍스트 파일을 입력으로 받아들이고 읽고 텍스트 파일 내의 데이터 섹션을 색인 #을 포함하는 구별 된 그룹으로 분리하는 작업 응용 프로그램을 만드는 것입니다. 섹션의 첫 번째 부분에있는 섹션.일반 텍스트 데이터를 관리되는 형식으로 변환하는 방법은 무엇입니까?

이것은 일반 텍스트 파일에서 데이터를 가져 와서 데이터 "그룹"의 섹션으로 구분하는 방법에 대한 질문 일 가능성이 큽니까? 일부 관리 형식으로 파일을 출력합니다.

텍스트 입력 파일에는 13 개의 필드가 있고 상태에 대한 추가 필드가 14 개 있습니다.

텍스트 입력 파일에는 약 1500-2000 개의 데이터 섹션 그룹이 있으므로 인덱스 된 최대 2000 개의 항목이 있고 항목의 이름이 "패키지 이름"인 첫 번째 필드가됩니다. 데이터의 섹션은 다음과 같이 될 것입니다 :

Package: horse 
Version: 1.2.3 
Depends: libgcc 
Provides: 
Status: user installed 
Other: other info 
Other2: other info 2 

Package: cow 
Version: 2.3.4 
Depends: libhay 
Provides: milk 
Status: user installed 
Other: white with black spots 
Other2: has a red cow bell around her neck 

Package: tractor 
Version: 0.9.22 
Depends: diesel 
Provides: 

...

어떻게

는 데이터를 읽고 적절한 테이블 또는 항목이나 데이터 세트에 배치 할 수 있습니까? ":"및 저장 자체가 Package에 저장되어있는 Dictionary<string, string>의 각하고 단순한 솔루션은 단지에있는 파일을 한 번에 선 분할을 읽는 것

+0

사전에 적합 할 것으로 보입니다. ':' – Earlz

+0

으로 나누면됩니다. 평범한 텍스트 파일을 만들 때 XML을 사용하는 것을 제안하는 것이 일반적으로 싫지만, XML 데이터를 런타임 데이터 구조로 비 직렬화하는 .NET의 좋은 지원이 있습니다. . – reuben

답변

0

이전의 편집에 대한

PS 덕분에 List<Package>에 추가하십시오. "패키지"라는 키워드를 얻을 때마다 새로운 Package 인스턴스를 만들고이를 목록에 추가하십시오. 아래의 코드는 트릭을 수행하지만 매우 방어 적으로 코딩되지는 않습니다.

static void Main(string[] args) 
    { 
     string line; 
     List<Package> packages = new List<Package>(); 
     Package package = null; 
     StreamReader file = new System.IO.StreamReader("TextFile1.txt"); 
     while ((line = file.ReadLine()) != null) 
     { 
     string[] pair = line.Split(new string[] { ": " }, StringSplitOptions.None); 
     if (pair.Length != 2) 
      continue; 
     if (pair[0] == "Package") 
     { 
      package = new Package(); 
      packages.Add(package); 
     } 
     package.Values.Add(pair[0].Trim(), pair[1].Trim()); 
     } 
     file.Close(); 
     Console.WriteLine(packages.Count); 
     foreach (Package p in packages) 
     { 
     Console.WriteLine(p); 
     foreach (KeyValuePair<string, string> pair in p.Values) 
      Console.WriteLine("{0}={1}", pair.Key, pair.Value); 
     } 
     Console.ReadLine(); 
    } 
    } 

    class Package 
    { 
    public Dictionary<string, string> Values; 
    public Package() 
    { 
     Values = new Dictionary<string, string>(); 
    } 
    } 
+0

대단한! 이 코드를 코드에 넣으면 예상대로 작동합니다! 내가 한 일은 배열을 만들고 데이터를 분할하는 것입니다. 그러나 나는 이것을하기 위해 최신 스타일을 사용하여 최신 방법을 찾고 싶습니다. 전에는 사전을 사용하지 않아도됩니다. 크기가 9K 인 작은 파일에 대해서는 정상적으로 작동하지만 파싱은 완벽합니다. 나는 다른 것을 950K 열었고 cpu는 몇 분 동안 80-100 %에 있었다. 방금 확인한 후 "응답하지 않음"이라고 표시됩니다. 몇 분이 걸릴 수도 있지만, 이제는 GUI에서 어떤 활동 모니터가 필요한지 궁금합니다. –

관련 문제