2012-04-04 2 views
3

검색했지만 내 대답을 찾지 못했습니다. 면책 조항 : 저는 C#의 새로운 것입니다.하지만 기존의 로그 파일에서 읽기, 탭으로 구문 분석, 결과를 특정 상태로 처리 (전자 메일 프로세스), 부서별로 그룹화 ie Investment Bank)을 입력 한 다음 부문 별 전자 메일 전환 수에 대한 통계를 계산하고 새 로그 파일에 인쇄하십시오.그룹 스플릿 후 값별 결과

질문하기 전에 프로그램 자체에 약간의 배경 지식을 제공하고 싶습니다. 나는 현재 부서별로 그룹화하고자하는 시점에 있으며이를 수행하는 방법을 파악할 수 없습니다.

편집 : 원래 데이터 :

static void Main() 
{ 
    { 

     List<string> list = new List<string>(); 
     using (StreamReader reader = new StreamReader(Settings.LogPath + "2012-3-10.log")) 
     { 
      string line; 
      int i = 0; 
      while ((line = reader.ReadLine()) != null) 
      { 
       list.Add(line); 
       i++; 

       string[] split = line.Split('\t'); 

       string processing = split[0]; 

        if(processing.StartsWith("Process")) 
        { 
         string division = split[1]; 
         int zipFiles; 
         int.TryParse(split[4], out zipFiles); 
         int conversions; 
         int.TryParse(split[5], out conversions); 
         int returnedFiles; 
         int.TryParse(split[5], out returnedFiles); 
         int totalEmails; 
         int.TryParse(split[5], out totalEmails); 

그래서 나는이 점에 프로그램이이 뭔가를 뱉어 : 여기

Status   Division  Time   Run Time Zip Files Conversions Returned Files Total E-Mails 
Process E-mail Investment Bank 12:00 AM 42.8596599 1    0    1    1 
End Processing     12:05 AM 44.0945784 0    0    0    0 
Process E-mail Investment Bank 12:10 AM 42.7193253 2    1    0    1 
Process E-mail Treasury   12:15 AM 4.6563394 1    0    2    2 

내가 지금까지 가지고있는 코드입니다 콘솔은 다음과 같습니다 :

"Investment Bank", "Treasury"등의 그룹입니다. 그러면 총계를 계산할 수 있습니다.

마지막 로그 파일은 다음과 같습니다

Division   Zip Files Conversions Returned Files Total E-mails 
Investment Bank 3   1    1    2 
Treasury   1   0    2    2 
+0

원래 데이터는 무엇입니까? –

+0

왜 단순히 재무 리더를 스위치 카드로 사용하여 기준 (Treasury vs. Investment Bank 등을 지정하든)에 따라 데이터를 분리하지 마십시오. 개인적으로 아마 각 부분을 자신의 객체로 캡쳐하고 그것을 참조 할 부모 객체로 감쌀 것입니다. IE의 클래스 사업부는 리스트와 List CBRRacer

+0

@ Johnny_D를 가지고 있습니다 - 원래의 데이터 세트를 추가했습니다. 이것은 로그 파일의 아주 작은 뷰일뿐입니다. 더 많은 부서들이 있습니다. –

답변

1

다음 코드는 당신이 필요하지 :

string filename = @"D:\myfile.log"; 
var statistics = File.ReadLines(filename) 
    .Where(line => line.StartsWith("Process")) 
    .Select(line => line.Split('\t')) 
    .GroupBy(items => items[1]) 
    .Select(g => 
      new 
       { 
        Division = g.Key, 
        ZipFiles = g.Sum(i => Int32.Parse(i[2])), 
        Conversions = g.Sum(i => Int32.Parse(i[3])), 
        ReturnedFiles = g.Sum(i => Int32.Parse(i[4])), 
        TotalEmails = g.Sum(i => Int32.Parse(i[5])) 
       }); 

Console.Out.WriteLine("Division\tZip Files\tConversions\tReturned Files\tTotal E-mails"); 
statistics 
    .ToList() 
    .ForEach(d => Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", 
      d.Division, 
      d.ZipFiles, 
      d.Conversions, 
      d.ReturnedFiles, 
      d.TotalEmails)); 

그것은 익명 클래스와 혼란을하지 않을 경우 (불분명하지만)도 짧아 대신 배열 작업을 할 수있다. 당신이 그러한 코드로 intrested 경우 알려주십시오.

+0

와우, 정말 고마워. 정확히 내가 무엇을 찾고있는거야. 이제 이것을 통해 논리가 무엇인지 이해하려고 시도하십시오.) –

+0

이전에 상사가이 프로젝트에 저를 던졌을 때 말했던 것처럼 이것이 대단한 것은 아닙니다. 그래서 C#을 학습하고 프로그래밍을 배우면서 배우는 동안 . –

+0

저는 C#을 사용했지만 (꽤 많은 LINQ는 아니지만) 꽤 오래되었습니다. GroupBy를 강력하게 사용할 수 있을지 전혀 몰랐습니다. 이것은 권력의 위대한 모범입니다. –

0

나는 핸들이에 다음 클래스를 구축 할 것입니다.

public class xxxx 
{ 
    Public string Division {get;set} 
    Public Dictionary<string,int> something{get;set;} 
} 

같은

뭔가 그럼 그냥

List<xxx> Divisions; 

이 최적 인 경우 확실하지로 캡슐화 할 수 있지만 그것은 작동합니다.

+0

응답에 감사드립니다. 나도 이걸 들여다 보았다. 다시 말하지만 C#을 처음 접했을 때 나는이 일을 처리하는 방법에 대한 연구를해야만했다. 어쩌면 xxx와 같은 것이 아닌 내 데이터를 사용하여 예제를 제공 할 수 있습니까? 그것은 매우 도움이 될 것입니다. 감사! –