【发布时间】:2013-03-22 22:04:59
【问题描述】:
我正在开展一个项目,该项目涉及基于 csv 文件的一些变量/参数创建输出,我正在寻找处理它的最佳方法。
我有一个中等大小的 csv 文件,如下所示:
input.csv
B|Person1|3000
A|Person2|3000
C|Person3|5400
A|Person4|1700
C|Person5|9400
D|Person6|2400
B|Person7|2000
A|Person8|3400
A|Person9|1000
A|Person10|2500
A|Person11|3000
我希望输出看起来像:
输出.csv
A|Person2|3000
A|Person4|1700
B|Person1|3000
B|Person7|2000
C|Person3|5400
D|Person6|2400
但输出只能是 6 人 (AABBCD) 并且第 3 列的总和 input.csv 的顶行向下创建输出:
- 如果行为空,则根据字母 A-D(Column1)填写人,[可选]忽略第 3 列的总和。
- 如果行不为空且第 3 列的总和小于 1800 - 跳过(继续)。
- 如果行不为空且第 3 列的总和超过 1800,则替换最大值(继续)。
- [可选] 完成后,重新检查是否可以用更高的值替换任何人;本质上是创建一个 18000 年以下最有价值的人的名单。
注意:所有6个参数都必须根据它们的第1列位置填写。
我起初想生成一个 output.csv 文件,其中第一列包含 AABBCD,并使用 awk 匹配和条件语句添加行。然后我开始研究使用 awk 数组(将 3 列传递给 3 个数组并根据索引分配值)...
但是现在,似乎 python 可能是处理 csv 文件时要走的路,但在使用 python 编写脚本时,我仍然是新手;您能否推荐适当的路径来产生所需的输出?
提前非常感谢,这让我发疯了。
编辑: 简单地说 - 仅匹配前 6 个(AABBCD:带有 2As、2Bs、1C、1D)并且第 3 列的最终总和
【问题讨论】:
-
Python 一路走好!免责声明:我喜欢 Python。现在有一个更喜欢 Python 的实际原因:Python 代码可以编写成跨平台的,虽然你可以在 cygwin 上使用 bash,但谁愿意这样做?
-
输出是否必须是您指定的那 6 个? 2 和 3 是什么意思,即即使您说要跳过 1800 以下的值,您的 output.csv 的值也超过 1800。最后,“替换最高值”是指将当前行添加到顶部?
-
@AndreasGS - 输出必须是由 col1 中的字母字面关联的组。我想你可能读错了,我正在寻找 col3 的总和等于或低于 18,000(不是 1800)。如果#1 填补了所有职位并且超过 18,000,#3 只是看起来解决了这个问题。为了纠正这个问题,#3 将通过替换较大的整数来选择性地降低总和。希望这可以清除它。感谢您的评论。
-
@bernie - 我承认,我一直在使用 cygwin...哈哈,我在我的 Fedora 盒子上启动了这个脚本(因此我使用 bash / awk 来生成上述文件)。感谢您的输入!我正在研究以下一些建议。
标签: python bash csv if-statement awk