2015-09-17 7 views
5

Finansal Veri Kalitesi Yönetimi Enterprise Edition (FDMEE) adı verilen bir Oracle EPM Ürünüyle çalışıyorum. Bir veri dosyasını ayrıştırmak ve FDMEE ürün şemasındaki özel bir tabloya itmek için bir Jython betiği yazdım.IndexError: Aralık dışı dizin: 7

Veri dosyasının bir alt kümesini zorladığımda iyi çalışıyor. Ben tüm veri dosyasını ayrıştırmak Ama bu hata IndexError başarısız: endeksi aralık dışında: 7.

ardından hata mesajı ben alırsınız:

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 

ardından kullandığım kodudur:

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

Bu hata listenin 8 unsuru yok bildiriyor: Bir bonus olarak

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

, burada kod yazmak için daha etkili bir yoldur. Beklenen çıktı nedir? Kontrol et ve geri izlemeyi dene. –

+0

Ayrıca, Pandalar belgelerini [burada] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html) okuyun ve veri çerçeveleriyle çalışın, bu amaç için çok daha iyiler. –

+0

Kodunuza bakmak için fazla zamanım olmadı, ancak Ds_Reader'ı csv modülünden kullanmanızı öneririm, böylece sütunu sütun dizinine göre dizine göre görebilirsiniz. Bunun yerine deneyin ve problemi bilmeden bir çözüm bulabilirsin – Connor

cevap

0
biz gerçekten size çok fazla yardımcı olamaz senin .csv görmeden

, ama ...

  1. emin olun sizin csv her satırı doğru formatı
  2. 'a sahiptir. csv'deki son satırın sadece beyaz boşluk olmadığından emin olun. Özellikle newline=''
+0

Merhaba Vikram, öneri için teşekkürler.Dosya doğru biçime sahip ve bir boşluk ile bitmiyor (yalnızca doğrulanmış), Veri kümesi küçükse, veriyi dosyadan ürün tablosuna yükler, ancak aynı biçimdeki daha büyük bir veri kümesi –

+0

yükleme başarısız olur. dosya açıkça formatta bulunmuyor veya bu hatayı almıyorsunuz. Hata, 8'den az alana sahip bir hattın olduğunu gösterir. – Barmar

+0

@Barmar Teşekkürler Barmar/Vikram, oldukça büyük bir dosya, testler yapmak için bu büyük dosyayı oluşturan yaklaşık 7-8 ayrı dosya oluşturdum, yanlış formatlı satırlar varsa tüm dosyayı doğrulamanın bir yolunu görmeme izin verin, Bu veri dosyası, doğrudan geçerlilikten sonra dosyayı dönüştüren Ab Initio adlı bir aracıdır ve güncellemeyi size bildirir. –

2

the documentation for csv.reader yılında isteğe bağlı parametreleri de

  • Bak, belli ki etkilenen satır için 8'den az sütun vardır. Bir try/except blok kullanarak hata ayıklama:

    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

    Düzenleme için teşekkürler Alexander! Kodu test etmek, güncellemeyi size bildirir. –

    +0

    Dizin() 'yerine aylar için bir dict kullanmalısınız. Ay = {'JAN': 1, 'FEB': 2, ...} 'gibi bir şey daha sonra recReader: row_num = months.get (row [7], None)' satırında yapabilirsiniz. dicts O (1) araması varken indeks() 'in indeksi almak için her seferinde listeyi geçmesi gerekir. – IanAuld

    +0

    @IanAuld Bilgi için teşekkürler Ian, Havenot daha önce kullandı, bu yaklaşım için dict denememe izin verin, güncellemeyi size bildirir. –