我处理了这些非常复杂的数据文件,在处理每个文件时,我使用 orderedDictionary 来捕获键和值。每个 orderedDictionary 都附加到一个列表中,所以我的最终结果是一个字典列表。由于这些文件中捕获的数据的多样性,它们有许多共同的键,但有足够多的不常见键使将数据导出到 Excel 比我希望的更复杂,因为我真的需要以一致的方式推出数据结构。
每个键的结构如下
Q_#_SUB_A_COLUMN_#_NUMB_#
例如我有
Q_123_SUB_D_COLUMN_C_NUMB_17
我们可以如下翻译 key
Question 123
SubItem D
Column C
Instance 17
因为有一个子项 D、列 C 和实例 17,所以必须有一个子项 A、列 B 和实例 16
但是,其中一个源文件可能会填充数据值(并且范围不超过上述示例的键和其他一些源文件可能会以
Q_123_SUB_D_COLUMN_C_NUMB_13
因此,当我遍历字典列表以提取所有唯一键实例时,我可以在 csv.dictwriter 中将它们用作列标题,我的计划是对生成的唯一列标题列表进行排序,但我做不到似乎可以进行排序
具体来说,我需要它进行排序,以便结果看起来像
Q_122_SUB_A_COLUMN_C_NUMB_1
Q_122_SUB_B_COLUMN_C_NUMB_1
Q_123_SUB_A_COLUMN_C_NUMB_1
Q_123_SUB_B_COLUMN_C_NUMB_1
Q_123_SUB_C_COLUMN_C_NUMB_1
Q_123_SUB_D_COLUMN_C_NUMB_1
dot
dot
dot
Q_123_SUB_A_COLUMN_C_NUMB_17
Q_123_SUB_B_COLUMN_C_NUMB_17
Q_123_SUB_C_COLUMN_C_NUMB_17
Q_123_SUB_D_COLUMN_C_NUMB_17
最大的问题是,在打开这些文件的任何特定集合之前,我不知道回答了多少问题,回答了多少子问题,每个问题或子问题关联了多少列,或者有多少列存在问题、子问题或列的任何特定组合的实例,我不想这样做。使用 Python,我能够将 1,200 多行 SAS 代码减少到 95 行,但是在我开始将其写入 CSV 文件之前的最后一点我似乎无法理解。
如有任何意见,我们将不胜感激。
我的计划是通过遍历字典列表找到所有唯一键,然后对这些键进行正确排序,这样我就可以使用这些键作为列标题创建一个 csv 文件。我知道我可以找到唯一键将其推出并手动对其进行排序,然后读回排序后的文件,但这看起来很笨拙。
请您参考如下方法:
排序时只需提供一个足够聪明的函数作为键即可。
>>> (lambda x: tuple(y(z) for (y, z)
in zip((int, str, str, int),
x.split('_')[1::2])))('Q_122_SUB_A_COLUMN_C_NUMB_1')
(122, 'A', 'C', 1)
