2015-01-28 5 views
0

CSV 파일을 읽고 정렬하고 있습니다. 어떤 도움을 이해할 수있을 것이다파일의 열을 기준으로 DataTable 정렬

  DataTable dt = new DataTable(); 
      dt.Columns.Add("accountholder", typeof(string)); 
      dt.Columns.Add("accountnumber", typeof(int)); 
      dt.Columns.Add("accounttype", typeof(string)); 
      dt.Columns.Add("bankname", typeof(string)); 
      dt.Columns.Add("branch", typeof(string)); 
      dt.Columns.Add("amount", typeof(double)); 
      dt.Columns.Add("date", typeof(DateTime)); 

      string line; 

     //CultureInfo culture = CultureInfo.InvariantCulture; 
     StreamReader sr = new StreamReader(@"C:\\Test\\debitorders.csv"); 
     StreamWriter sw = new StreamWriter(@"C:\\Test\\output.txt"); 

     while ((line = sr.ReadLine()) != null) 
     { 
      if (line.Length > 0) 
      { 
       string[] inputArray = line.Split(new char[] { ',' }); 
       dt.Rows.Add(new object[] { 
        inputArray[0].Trim().Substring(0,1), 
        inputArray[1].Trim(), 
        long.Parse(inputArray[2].Trim()), 
        inputArray[3].Trim(), 
        inputArray[4].Trim(), 
        inputArray[5].Trim(), 
        (long)(100 * double.Parse(inputArray[6].Trim())), 
        DateTime.Parse(inputArray[7].Trim()) 
       }); 



       DateTime date = account.Field<DateTime>("date"); 
       string[] outputLine = new string[]{ 
        initial, 
        accountholder, 
        accountnumber.ToString(), 
        accounttype, 
        bankname, 
        branch, 
        amount.ToString(), 
        date.ToShortDateString() 
       }; 
       Console.WriteLine(string.Join(",",outputLine)); 
      } 
     } 
     Console.ReadLine(); 

:

내가 여기 데이터 테이블

에서 나에게 BANKNAME에 따라 출력을 제공하는 DataTable을 정렬 시도하고 내가 이미 가지고있는 코드입니다.

당신에게

+0

[FileHelpers] (http://filehelpers.sourceforge.net/)를 사용하면 훨씬 쉽고 멋지게 처리 할 수 ​​있습니다. 또한 StreamReader 및 StreamWriter를 닫지 않는 것 같습니다. 당신은 [사용하는 문장으로 그들을 캡슐화하는 것이 가장 좋을 것이다] (http://www.hanselman.com/blog/WhyTheUsingStatementIsBetterThanASharpStickInTheEyeAndASqlConnectionRefactoringExample.aspx). – BCdotWEB

+0

또한 StreamWriter를 사용하지 않고 콘솔로 출력합니다. 'Field ("성")은 어디에서 왔습니까? 귀하의 코드를 재구성하고 작은 비트로 분할하는 것이 좋습니다. 원시 데이터를 읽고, 원시 데이터를 올바른 형식의 데이터로 변환하고, 출력을 작성하는 것이 좋습니다. IMHO이 코드를 사용하면 많은 사람들이 기대할 수있는 문제가 너무 많습니다. 도와주세요. – BCdotWEB

+0

("성")과 ("초기")는 "계좌 소유자"를 구성합니다. 코드가 아직 끝나지 않았으므로 여전히 멈추었습니다. 난 그냥 더 쉬운 방법을 원해. – Brian02

답변

1

코드를 감사하고 당신은 아마 여러분의 필요에 내 코드에 적응해야하므로 일치하지 않는 것 결과를 원하는 기록했다. 그러나 내 코드 예제에서는 DataTable 및 DataRow 항목을 제거하는 방법을 보여줍니다. LINQ 메서드는 가능한 경우 사용되며 csv 파일을 읽는 방법은 간단한 도우미 메서드입니다. 코드에 대해 궁금한 점이 있으면 알려주십시오.

//reading the csv and create anonymous object for each line 
var inputEntries = File.ReadLines(@"C:\\Test\\debitorders.csv") 
.Select(line => 
     { 
      var values = line.Split(','); 
      return new 
      { 
       AccountHolder = values[0].Trim().Substring(0,1) + values[1].Trim(), 
       AccountNumber = long.Parse(values[2].Trim()), 
       AccountType = values[3].Trim(), 
       BankName = values[4].Trim(), 
       Branch = values[5].Trim(), 
       Amount = 100 * double.Parse(values[6].Trim()), 
       Date = DateTime.Parse(values[7].Trim()) 
      }; 
     }); 

var banks = inputEntries 
     .OrderBy(e => e.BankName) 
     .GroupBy(e => e.BankName, e => e); 

//output data 
foreach(var bank in banks) 
{ 
    //output bank header 
    var AccountName = bank.Key; 
    if (AccountName.Length >= 16) 
    { 
     AccountName = AccountName.Substring(0, 16); 
    } 
    else 
    { 
     AccountName += new string(' ', 16 - AccountName.Length); 
    } 
    var NumberOfAccounts = bank.Count(); 
    var TotalAmount = bank.Select(acc => acc.Amount).Sum(); 
    var Header = NumberOfAccounts.ToString("000") + TotalAmount.ToString("0000000000"); 
    Console.WriteLine(Header); 

    //sort accounts 
    var sortedAccounts = bank 
         .OrderBy(acc=> acc.AccountHolder) 
         .OrderByDescending(acc => acc.Amount); 

    //output accounts 
    foreach(var account in sortedAccounts) 
    { 
     var outputLine = 
      account.AccountHolder + 
      account.AccountNumber + 
      account.AccountType + 
      account.Amount + 
      account.Date.ToShortDateString(); 

     Console.WriteLine(outputLine); 
    } 
} 
관련 문제