2013-04-08 32 views
1

我在介紹c#類,並且我們的資源很糟糕。分析數據c#

我已經使用StreamReader輸入了csv文件,我想要做的是分析某個特徵的信息。我感到困惑的是,如何讓我的程序知道從每一行中選擇某些部分的數據?可以說,我想選擇人數最多的

例如,如果一條線路是:

2003-04-12,334,367,289

,我會在一份聲明中加入所以在這裏做什麼? :

input = reader.ReadLine(); 
while (input != null) 
{ 
    ... 
    input = reader.ReadLine(); //next row 
} 
reader.Close(); 

在此先感謝。

+0

你_want_做對文件中的每一行的比較,而讀它(這是緩慢的),或者,你可以傾倒出整個文件_然後_解析它尋找你給的例子上面的模式?數據總是遵循你給我們的模式嗎? – Brian 2013-04-08 17:32:00

+0

嘿布萊恩,我想做一個比較每一行,每行具有不同的數字相同的數據格式。第一個是日期 – user2258629 2013-04-08 17:33:58

+0

如果它特別遵循該模式,我會使用[正則表達式](http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx)來執行工作。 – Brian 2013-04-08 17:36:46

回答

0

Using Regex to capture groups可能是你在找什麼。

事情是這樣的:

var lineRegex = new Regex(@"(?<year>[0-9]+)\-(?<month>[0-9]+)\-(?<day>[0-9]+), (?<first>[0-9]+), (?<second>[0-9]+), (?<third>[0-9]+)"); 
// ... 
var matches = lineRegex.Matches(input); 

你現在的結果在比賽元素的集合。這只是一個例子,創建正確的Regex字符串本身就是一項任務。

0

做的是:a)分割線分成部​​分和B)解析部分爲數字的最簡單的東西安全地使用.TryParse()

static void Main(string[] args) 
{ 
    var reader=System.IO.File.OpenText("Data.csv"); 
    List<double[]> data=new List<double[]>(); 
    var line=reader.ReadLine(); 
    double max=0; 
    while(!reader.EndOfStream) 
    { 
     line=reader.ReadLine(); 
     string[] parts=line.Split(','); 
     //parse first part as date 
     DateTime date=DateTime.Parse(parts[0]); 
     //parse rest of parts as float/doulbe/decimal 
     double[] values=new double[parts.Length-1]; 
     for(int i=0; i<values.Length; i++) 
     { 
      //for each value in row convert string to number safely. 
      double x = 0; 
      double.TryParse(parts[i+1], out x); 
      values[i]=x; 
     } 
     //keep data values in list 
     data.Add(values); 
     //keep highest from 1st column 
     if(values[0]>max) { max=values[0]; } 
    } 
    reader.Close(); 
} 
+0

順便說一句,如果你想要更好的速度,那麼試試'System.IO.File.ReadAllLines()'方法。 – ja72 2013-04-08 18:17:41