我试图找出一种更好的方法来从大量文件中提取数据,对一些数据运行额外的计算,最后将其格式化为电子表格应用程序可读的格式。以下是我目前的做法,但我相信一定有更简单的方法。
首先,我创建一个将搜索文件并提取数据的定义。我使用一个定义,因为有时数据会从多个位置编译。我通过混合正则表达式来做到这一点并找到所有。如果需要,可以采用不同的格式。结果是这样的:
RawData=
[[M1,A1,305.91,288.12,Variable_M1_A1],
[M1,A2,319.07,303.70,Variable_M1_A2],
[M2,A1,237437.32,191460.91,Variable_M2_A1],
[M2,A2,270773.28,192581.05,Variable_M2_A2]]
我希望对一些数据做的是以这样一种方式组织它,即从变量 A 和 M 创建网格,然后将列中的数据放置在正确的网格位置。实际上看起来像一个简单的二维矩阵,第一行和第一列表示变量。
csv 文件应如下所示:
Placeholder,A1,A2
M1,Variable_M1_A1,Variable_M1_A2
M2,Variable_M2_A1,Variable_M2_A2
我目前正在做的是创建一个空矩阵(在这种情况下为 3x3)调用它 Result 然后运行以下代码。当变量匹配时,基本上迭代所有行和所有变量,它为结果矩阵分配来自 RawData 的值。
MVar=[M1,M2]
AVar=[A1,A2]
for a in range(len(RawData):
for b in range(len(MVar)):
for c in range(len(AVar)):
if RawData[a][0]==Mvar[b] and RawData[a][1]==AVar[c]:
Result[b+1][c+1]=RawData[a][4]
我编写了一段代码,它将获取 RawData 矩阵并根据 M1 和 A1 的所有可能组合创建结果矩阵。如果我想将此输出到 .csv,我只需使用 csv.writer。因此,如果我只想组织已经存在的数据,这很有效。但是,当我想对数据进行计算时——例如生成另一列,该列基于未出现在矩阵中的 RawData 中的值——这变得很困难。例如,获取 csv 文件输出的样子:
Placeholder,A1,A2,NewA
M1,Variable_M1_A1,Variable_M1_A2,(RawData[0][3]*RawData[1][2])
M2,Variable_M2_A1,Variable_M2_A2,(RawData[2][3]*RawData[3][2])
请注意,用于计算的数据需要相同的 M 值但不同的 A 值。虽然可以做到这一点,但它很快就会变得非常复杂。
有没有更简单的方法来做到这一点?
编辑:使用自动生成 M 和 A 列表:
[MethodList[i] for i,x in enumerate(MethodList) if x not in MethodList[i+1:]]
这似乎使它更容易使用,但它仍然是一个复杂的过程!