5

Financial Data Quality Management Enterprise Edition (FDMEE) という Oracle EPM 製品を使用しています。データ ファイルを解析し、それを FDMEE 製品スキーマ内のカスタム テーブルにプッシュする Jython スクリプトを作成しました。

データ ファイルのサブセットをプッシュしているときに問題なく動作します。しかし、データ ファイル全体を解析すると、エラー IndexError: index out of range: 7 で失敗します。

以下は、私が受け取ったエラーメッセージです:

File "\\vmhodvesip4\D$\SVESI7\Custom\FDMEEApps\BFRVN/data/scripts/event/BefImport.py", line 5, in <module>

    if row[7]=='JAN':

IndexError: index out of range: 7

以下は私が使用するコードです:

import csv

recReader = csv.reader(open('D:/SVESI7/Custom/FDMEEApps/BFRVN/inbox/BF_Reven_Load/Test03big.txt'), delimiter='!')
for row in recReader:
    if row[7]=='JAN':
        period_num = '1'
    elif row[7]=='FEB':
        period_num = '2'
    elif row[7]=='MAR':
        period_num = '3'
    elif row[7]=='APR':
        period_num = 4
    elif row[7]=='MAY':
        period_num = 5
    elif row[7]=='JUN':
        period_num = 6
    elif row[7]=='JUL':
        period_num = 7
    elif row[7]=='AUG':
        period_num = 8
    elif row[7]=='SEP':
        period_num = 9
    elif row[7]=='OCT':
        period_num = 10
    elif row[7]=='NOV':
        period_num = 11
    elif row[7]=='DEC':
        period_num = 12
    else:
        period_num = 'skip'

    if period_num != 'skip':
        params1 = ['batch_plnapps_oi',row[7],period_num,'20' + row[1][-2:],row[2], row[3], row[4], row[5], row[6], row[8], row[9], row[10], row[11], round(row[12],12)]
        ins_stmt1 = "insert into aif_open_interface(batch_name,period,period_num,year,col03,col04,col05,col06,col07,col09,col10,col11,col12,amount) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
        fdmAPI.executeDML(ins_stmt1,params1,False)

fdmAPI.commitTransaction()
4

2 に答える 2

2

影響を受ける行の列は明らかに 8 列未満です。try/exceptブロックを使用してデバッグします。

for n, row in enumerate(recReader, start=1):
    try:
        month = row[7]
    except:
        print('Row {0}: {1}'.format(n, row))

おまけとして、コードを書くためのより効率的な方法を次に示します。

months = {'JAN': 1, 'FEB': 2, 'MAR': 3, 'APR': 4, 'MAY': 5, 'JUN': 6, 
          'JUL': 7, 'AUG': 8, 'SEP': 9, 'OCT':10, 'NOV': 11, 'DEC': 12]
for row in recReader:
    month = row[7]
    period_num = months.get(month, None)

    if period_num:
        params1 = ['batch_plnapps_oi', row[7], period_num, '20' + row[1][-2:], row[2], row[3], row[4], row[5], row[6], row[8], row[9], row[10], row[11], round(row[12], 12)]
        ins_stmt1 = "INSERT INTO aif_open_interface(batch_name, period, period_num, year, col03, col04, col05, col06, col07, col09, col10, col11, col12, amount) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
        fdmAPI.executeDML(ins_stmt1, params1, False)

fdmAPI.commitTransaction()
于 2015-09-17T02:38:54.197 に答える
0

.csv を確認しないと、あまり役に立ちませんが...

  1. csv のすべての行が正しい形式であることを確認してください
  2. csv の最後の行が単なる空白ではないことを確認してください。
  3. 特にcsv.reader のドキュメントでオプションのパラメーターを見てください。newline=''
于 2015-09-17T02:20:27.417 に答える