【问题标题】:Transpose and copy column data to each row转置和复制列数据到每一行
【发布时间】:2015-12-20 09:21:39
【问题描述】:

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

  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

我只是使用 etc,因为我想我正在尝试做的事情的想法会被实现。

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

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

【问题讨论】:

  • 你能把你的目标说得更清楚一点吗?我知道您正在尝试从一行中获取任意数量的字段并将它们复制到同一行的最后一列,对吗?您如何处理您的 CSV 文件,您是否已经开始以任何语言阅读/解析它?我的最后一个问题是,您是否尝试创建一个脚本/解析来简单地转换 CSV 并且您已经完成了,还是您需要将它作为更大应用程序中的某种模块/插件?
  • 是的,我更正了我的示例。在我的实际测试中。我有 1500 行 15 列。我正在处理我的最后一个专栏。本质上,我从第一行(i)开始,取该字段下的 30(J)个字段,我想转置(旋转)它们,使它们位于行尾的前面
  • 所以从上面的示例中,您没有触及 AD 列,而只想从 E 列中获取值并将它们附加到您正在操作的当前行的 E 列值?
  • 在没有价值的边缘情况下你想做什么,例如示例中的“等”值在哪里?

标签: javascript python excel csv scripting


【解决方案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) 每一行的最后一个元素"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多