2015-09-17 24 views
5

私は、Financial Data Quality Management Enterprise Edition(FDMEE)と呼ばれるOracle EPM製品を使用しています。データファイルを解析し、FDMEE製品スキーマ内のカスタムテーブルにプッシュするJythonスクリプトを作成しました。IndexError:インデックスが範囲外です。7

私は、データファイルのサブセットをプッシュしていたときにそれが正常に動作します。私は、全体のデータファイルを解析する場合でも、それはエラーはIndexErrorで失敗:範囲外のインデックス: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() 
+0

このエラーは、リストの8番目の要素を持っていない報告します。ボーナスとして

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

は、ここにコードを書くためのより効率的な方法です。予想される出力は何ですか?これをチェックして、トレースバックを試みます。 –

+0

また、Pandasのドキュメント[here](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html)を読んで、データフレームを扱うので、この目的にはるかに優れています。 –

+0

あなたのコードを見る時間はあまりありませんでしたが、csvモジュールのDict_Readerを使用して、インデックスではなくカラム名でそのカラムを見ることをお勧めします。代わりにこれを試してみてください。実際に問題を知らなくても解決策が見つかるかもしれません。 – Connor

答えて

0

あなたの.csvを見ることなく、私たちは本当にあなたのcsvファイルにそのすべての行を確認し、あまりにも多くのお手伝いをしますが、...

  1. することはできません正しい書式を持つ
  2. csvの最後の行が空白だけではないことを確認してください。
  3. the documentation for csv.reader
  4. にオプションのパラメータを見て、具体的newline=''
+0

こんにちはVikram、提案をありがとう。ファイルは正しい書式を持ち、空白で終わらない(確認されたばかり)。データセットが小さいが同じフォーマットのより大きいデータセットをロードできない場合、ファイルから製品テーブルにデータをロードする –

+0

ファイルが正しい形式を持っていないか、このエラーが表示されません。エラーは、8フィールド未満の行があることを示します。 – Barmar

+0

@Barmar Thanks Barmar/Vikramは非常に大きなファイルです。テストを行うためにこの大きなファイルを7-8個の別々のファイルから作成しました。不正な形式の行がある場合はファイル全体を検証する方法を見てみましょう。このデータファイルは、検証後にファイルを変換するAb Initioと呼ばれるツールの直接抽出フォームであり、更新を知らせます。 –

2

は明らかに影響を受けた行の8列よりも少ないがあります。 try/exceptブロックを使用してデバッグ:

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() 
+1

編集のためのアレクサンダーありがとう!コードをテストすると、アップデートを知らせます。 –

+0

'index()'の代わりに月を指定するべきです。 'months = {'JAN':1、 'FEB':2、...}'のようなものであれば、recReaderの行に対して 'period_num = months.get(row [7]、None)'を実行できます。 dictsがO(1)ルックアップを持っている間、 'index()'はインデックスを取得するたびにリストをトラバースする必要があります。 – IanAuld

+0

@IanAuld情報のおかげでイアン、Havenotは前にdictを使っていましたが、私はこのアプローチについてdictを試してみましょう。 –

関連する問題