将列数据转置并复制到每一行

时间:2015-09-23 07:06:07

标签: javascript python excel csv scripting

我在以下结构中设置了数据

  A ,B ,C ,D ,E
1 a1,b1,c1,d1,e1
2 a2,b2,c2,d2,e2
3 a3,b3,c3,d3,e3
4 a4,b4,c4,d4,e4

我想从E列下的每一行获取x字段,以便可以发生以下影响

  A ,B ,C ,D ,E
1 a1,b1,c1,d1,e1,e2,e3
2 a2,b2,c2,d2,e2,e3,e4
3 a3,b3,c3,d3,e3,e4,etc
4 a4,b4,c4,d4,e4,etc,etc

我刚刚使用过等等,因为我想象我想要做的事情的想法会被接受。

基本上转置数据只允许我取一个列的区域并将其变成一行,但我不想在转置后删除数据,我只是想复制那些区域,但我有一个大的电子表格(当前1500行并且正在增长)

虽然我正在使用电子表格,但这只是一个CSV,我很乐意使用各种脚本语言或编程语言,如果需要的话,我考虑过C ++,python,javascript等,但我不确定是什么是实现这一目标的简单方法。

1 个答案:

答案 0 :(得分:1)

这基本上应该是你所要求的。首先是一些虚拟数据:

def char_range(c1, c2):
    """Generates the characters from `c1` to `c2`, inclusive."""
    for c in xrange(ord(c1), ord(c2)+1):
        yield chr(c)

matrix = [[c + str(i) for c in char_range('a', 'e')] for i in range(1, 5)]

这给了我们:

[['a1', 'b1', 'c1', 'd1', 'e1'], 
 ['a2', 'b2', 'c2', 'd2', 'e2'],
 ['a3', 'b3', 'c3', 'd3', 'e3'],
 ['a4', 'b4', 'c4', 'd4', 'e4']]

现在有一些变量使表达式更易于阅读:

# How many values you want to grab for each row
x = 3

# Length of the last column in the matrix
last = len(matrix)

现在是魔法。我假设,如果我们到达最后一行的末尾,我们只会放少一些值。这应该只适用于您最后的x行。

[mr + [row[-1] for row in matrix[min(i+1, last):min(i+1+grab, last)]]
 for (i, mr) in enumerate(matrix)]

导致:

[['a1', 'a2', 'a3', 'a4', 'b4', 'c4', 'd4'],
 ['b1', 'b2', 'b3', 'b4', 'c4', 'd4', 'e4'],
 ['c1', 'c2', 'c3', 'c4', 'd4', 'e4'],
 ['d1', 'd2', 'd3', 'd4', 'e4'],
 ['e1', 'e2', 'e3', 'e4']]

注意min在这里使用,因为我们不想超出矩阵的界限,我们也不知道它是否是方阵等。表达式说"构造一个包含原始矩阵中第i行的新行,并添加从min(i+1, last)min(i+1+grab, last)"的每一行的最后一个元素。 / p>