2012-04-26 37 views
0

我有一個數據集,看起來像這樣Excel或C#或SQL解決方案,使週期

id, value1,value2,value3,value4,value5...value200 (i am showing only 5 but solution needs to accomodate 200 values) 
a, 10,4,2,0,0 
b, 23,0,0,2,0 
c, 0,2,4,0,0 
d, 0,0,0,1,0 

我想回多少值的計數每一行的數量,對尾部ONLY零。

爲它上面的數據是:

3 
4 
2 
1 

的解決方案可以是C#或者excel(配方,不VBA)

非常感謝你爲你的help./guidance並請讓我知道,如果我如果您在爲CSV數據讀取該文件,並手動解析它,並不是不明確

+0

在C#中檢索數據時,它的數據類型是什麼?即它是一個'DataTable' /'IEnumerable '列'id','value1'等,或CSV行的集合'IEnumerable ',或者是什麼? – mellamokb 2012-04-26 22:23:23

+0

@mellamokb他們在一個數據表 – 2012-04-26 22:30:49

+0

@mellamokb請查看我剛剛發佈的答案 – 2012-05-01 20:41:32

回答

1

這裏是我想的解決方案:電池的

  1. concatonate值
  2. 轉換爲數字的行(這將擺脫開始的零)
  3. 採取中期()在第0(這將擺脫尾隨0的)
  4. 最終的字符串的獲取長度的起始位置結束(這將產生正是所需要的結果)
+0

這很有道理,當我意識到你真正想要的東西時,我正在考慮類似的東西。這取決於將數據連接起來有多容易。您的電子表格中是否有數據? – sheepez 2012-05-01 22:34:37

2

,你可以做這樣的事情找到在開始第一非零項和結束:

// prepare sample data (as CSV) 
var csv = 
@"id, value1,value2,value3,value4,value5 
a, 10,4,2,0,0 
b, 23,0,0,2,0 
c, 0,2,4,0,0 
d, 0,0,0,1,0"; 

// get column data 
var lines = csv.Split('\n'); 
var rows = lines.Skip(1).Select (
    line => line.Split(',').Skip(1).Select (l => Convert.ToInt32(l))); 
var result = new List<int>(); 

foreach (var row in rows) 
{ 
    // for each row, remove 0's at beginning and end 
    var data = row.SkipWhile (r => r == 0).Reverse() 
     .SkipWhile (r => r == 0).Reverse(); 
    // and retrieve the count 
    result.Add(data.Count()); 
} 
// result = [3, 4, 2, 1] 
+0

這真是太棒了,你可以查看我剛剛發佈的答案 – 2012-05-01 20:41:20

-1

Excel數組公式。按下Ctrl + Shift + Enter確認公式輸入:

=MAX((B2:F2>0)*COLUMN(B2:F2))-MATCH(1,--(B2:F2>0),0)-0 

注意這個假設感興趣的數據始於列B.最終需求的-0改變,如果數據在不同的列開始。

+1

這些都不會返回正確的結果:= COUNTIF($ B3:$ D3;「 > 0「)| = IF(RIGHT(D3,1)= 「0」,1,0)。他們只返回[非]零值的數量,這不是OP所要求的。 – 2012-04-27 01:49:32

+0

非常感謝您的幫助,但這不起作用,它只是第一次評估B2:F2 – 2012-04-27 01:58:11

+0

返回錯誤我測試了它,它確實有效並返回了您的預期結果。你是否將它作爲數組公式輸入?如果你沒有,你會得到#VALUE錯誤。 – 2012-04-27 02:53:18