2016-02-29 42 views
0

我有一個CSV文件,它有許多行和列。除了第一列將是一個帳戶名稱以外,所有行都將不同。例如,有10個不同的帳戶名稱,每個帳戶名稱大約有100行。因此,對於出現的每個帳戶名稱,我需要爲該行中所有正在進行的列獲得一筆總和。將CSV文件中的列添加到不同的鍵

所以csv文件是這樣的:

史密斯,10,5,9

史密斯,9,5,6和

瓊斯,10,5,7

瓊斯9,6,5

需要被寫入到這樣的另一個文件:

史密斯,19,1 9,15

瓊斯,19,11,12

一直試圖使用數組或者一個字典做這一切上午,但我似乎無法在邏輯上完成這件事。

static void Main(string[] args) 
    { 
     String path = @"C:\Users\jhochbau\documents\visual studio 2015\Projects\CsvReader\CsvReader\Position_2016_02_25.0415.csv"; 

     string[] lines = File.ReadAllLines(path); 
     foreach(string line in lines) 
     { 
      string[] parsedLine = line.Split(','); 
      //for each iteration through the loop where string[0] is already existing 
      //I want to have sum = sum + string[1] 
     } 
     Console.Read(); 
    } 

我也嘗試過使用字典爲此,但最終只抓住行時,不同的名字出現了。

//To add account as key and each line as value 
foreach(var s in data) 
{ 
    string[] temp = s.Split(','); 
    //Adds key of account into dictionary, full string line as value. 
    dictionary.Add(temp[0], temp); 
    foreach (KeyValuePair<string, string[]> accountKeyValuePair in dictionary) 
    { 
     Console.WriteLine("Account = {}", accountKeyValuePair.Key); //Additional information: Input string was not in a correct format. 
    } 
} 

尋找一個鏈接到一個類似的例子,或者可能是一個溫柔的微調在正確的邏輯方向。我真的不想爲我編碼的答案。

+0

你熟悉'控制Break'處理..你可以通過創建一個模仿類做這個年代CSV文件結構..然後當你閱讀所有的數據轉換爲字符串[]你可以做一個while循環檢查帳戶名稱是否相等..當他們不..然後做你的計算和設置新的帳戶名稱等於前面例如帳戶名稱不等於第一次讀取初始化賬戶名= to'string.Empty'讀取第一個名字..併發送賬戶變量=第一個值,這將是'Smith'下一個讀取或字符串[] 0將等於史密斯。 ..第三不會 – MethodMan

+0

然後你做你的計算...等......有很多方法來做到這一點..如果你畫出來,你會看到它是多麼容易..也可以總結一個值string []使用'Linq和Skip()'函數 – MethodMan

+1

我想創建一個類來模仿CSV文件。但由於某種原因,認爲會有一種更簡單的方法。所以我會繼續做下去。謝謝你確認我的懷疑。 –

回答

0

檢查:

public static void Run() 
     { 
      var lines = new List<string>() { 
      "Smith, 10, 5, 9", 
      "Smith, 9, 5, 6", 
      "Jones, 10, 5, 7", 
      "Jones, 9, 6, 5" 
      }; 


      var aList = from l in lines       
         select new { Name = l.Split(',')[0], Value1 = Convert.ToInt32(l.Split(',')[1]), Value2 = Convert.ToInt32(l.Split(',')[2]), Value3 = Convert.ToInt32(l.Split(',')[3]) }; 

      var vList = from a in aList 
         group a by a.Name into g 
         select new { Name = g.Key, Value1Sum = g.Sum(a => a.Value1), Value2Sum = g.Sum(a => a.Value2), Value3Sum = g.Sum(a => a.Value3) }; 

      foreach (var v in vList) 
       Console.WriteLine("{0} {1} {2} {3}", v.Name, v.Value1Sum, v.Value2Sum, v.Value3Sum); 
     } 
相關問題