多列文件中列的行标签

Row lables to columns in multi column file

我是 Python 的新手,正在使用 2.7.1 版作为 Hyperion FDMEE 的一部分。 我有一个文件,我需要重新排列列,并将一列分成 3 列作为同一文件的一部分。

源文件;

ACCOUNT;UD1;UD2;UD3;PERIOD;PERIOD;AMOUNT
QTY;032074;99953;53;2017.07.31;2017.07.31;40.91
COGS;032074;99953;53;2017.07.31;2017.07.31;-7488.36
TURNOVER;032074;99953;53;2017.07.31;2017.07.31;505.73
QTY;032075;99960;60;2017.07.31;2017.07.31;40.91
COGS;032075;99960;60;2017.07.31;2017.07.31;-7488.36
TURNOVER;032075;99960;60;2017.07.31;2017.07.31;505.73

我已经按照这个脚本对列进行了重新排序;

infilename = fdmContext["OUTBOXDIR"]+"/Targit_1707.dat"
outfilename = fdmContext["OUTBOXDIR"]+"/TargitExport.csv"

import csv

infile = open(infilename, 'r')
outfile = open(outfilename, 'w+')

for line in infile:
  column = line.split(';')


  outfile.write(column[1] + ";" + column[2] + ";" + column[3] + ";" + column[4] + ";" + column[0] + ";" + str(column[6].strip('\n')) + ";201701" + "\n")


outfile.close()
infile.close()

生成结果;

UD1;UD2;UD3;PERIOD;ACCOUNT;AMOUNT;201701
032074;99953;53;2017.07.31;QTY;40.91;201701
032074;99953;53;2017.07.31;COGS;-7488.36;201701
032074;99953;53;2017.07.31;TURNOVER;505.73;201701
032075;99960;60;2017.07.31;QTY;40.91;201701
032075;99960;60;2017.07.31;COGS;-7488.36;201701
032075;99960;60;2017.07.31;TURNOVER;505.73;201701

但我正在努力将帐户列(QTY、COGS、TURNOVER)转置为单独的列,如下例所示;

UD1;UD2;UD3;PERIOD;QTY;COGS;TURNOVER;201701
032074;99953;53;2017.07.31;40.91;-7488.36;505.73;201701
032075;99960;60;2017.07.31;40.91;-7488.36;505.73;201701

如有任何建议,我们将不胜感激。

使用dict,例如:

import csv

fieldnames = infile.readline()[:-1]
fieldnames = fieldnames.split(';')[1:5] + ['QTY', 'COGS', 'TURNOVER']

writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()

record_dict = {}
for i, line in enumerate(infile):
    if not line: break

    line = line[:-1].split(';')

    # Assign column data every 1,2,3 lines
    mod_row = (i % 3)+1

    if mod_row == 1:
        record_dict['QTY'] = line[6]
        record_dict['UD1'] = line[1]
        # ... and so on
    if mod_row == 2:
        record_dict['COGS'] = line[6]
    if mod_row == 3:
        record_dict['TURNOVER'] = line[6]

        writer.writerow(record_dict)
        record_dict = {}

Output:
UD1,UD2,UD3,PERIOD,QTY,COGS,TURNOVER
032074,,,,40.91,-7488.36,505.73
032075,,,,40.91,-7488.36,505.73

使用 Python 测试:3.4.2

Read about:
Python » 3.6.1 Documentation csv.DictWriter