2012-04-26 38 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