【发布时间】:2014-09-10 18:59:46
【问题描述】:
我有如下 CSV 文件。这是一个包含数千条记录的巨大文件。
输入.csv
No;Val;Rec;CSR
0;10;1;1200
0;100;2;1300
0;100;3;1300
0;100;4;1400
0;10;5;1200
0;11;6;1200
我想通过在第一列“否”之后添加新列“PSR”来创建 output.csv 文件。此列值取决于列“PSR”值。对于第一行,“PSR”应为零。从下一条记录开始,它取决于上一行中的“CSR”值。如果当前和先前记录的 CSR 值相同,则“PSR”应为零。如果不是,则 PSR 值应具有先前的 CSR 值。例如,第 2 行 CSR 的值为 1300,这与第 1 条记录中的值不同(它是 1200)。所以第 2 行的 PSR 值应为 1200。第 2 行和第 3 行的 CSR 值相同。因此,第 3 行的 PSR 值应为零。因此,新值 PSR 取决于当前和先前字段中的 CSR 值。
输出.csv
No;PCR;Val;Rec;CSR
0;0;10;1;1200
0;1200;100;2;1300
0;0;100;3;1300
0;1300;100;4;1400
0;1400;10;5;1200
0;0;11;6;1200
我的方法:
- 使用 csv.reader 并遍历列表中的对象。将第 5 列复制到列表中的第 2 列。向下移动一排。
- 然后检查第 2 列和第 5 列(PCR 和 CSR)中的值,如果两个值相同。将 PCR 值替换为零。
我在进行第一步编码时遇到问题。我可以复制该列,但无法移动它。第二步也很简单。
另外,我不确定这种方法是否正确任何指针/建议都会很有帮助。
注意:我无法在 CentOS 上安装 Pandas。所以没有这个模块的帮助会更好。
我的代码:
with open('input.csv', 'r') as input, open('output.csv', 'w') as output:
reader = csv.reader(input, delimiter = ';')
writer = csv.writer(output, delimiter = ';')
mylist = []
header = next(reader)
mylist.append(header)
for rec in reader:
mylist.append(rec)
rec.insert(1, rec[3])
mylist.append(rec)
writer.writerows(mylist)
【问题讨论】: