2015-09-17 13 views
5

Pracuję z produktem Oracle EPM o nazwie Financial Data Quality Management Enterprise Edition (FDMEE). Napisałem skrypt Jython, aby przetworzyć plik danych i przenieść go do niestandardowej tabeli w schemacie produktu FDMEE.IndexError: indeks poza zakresem: 7

Działa dobrze, gdy naciskam podzbiór pliku danych. Ale kiedy przetwarza cały plik danych, nie jest on z błędu IndexError: indeks poza zakresem: 7.

Poniżej znajduje się komunikat o błędzie otrzymuję:

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 

Poniżej przedstawiono kod używam:

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

Ten błąd raportów, które nie mają 8th element listy. Jakie są oczekiwane wyniki? Sprawdź to i spróbuj znaleźć informacje zwrotne. –

+0

Ponadto, przeczytaj dokumentację Pandy [tutaj] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html) i pracuj z ramkami danych, są o wiele lepsze do tego celu. –

+0

Nie miałem zbyt wiele czasu, aby przyjrzeć się twojemu kodowi, ale sugerowałbym użycie Dict_Reader z modułu csv, aby można było spojrzeć na kolumnę według nazwy kolumny raczej według indeksu. Spróbuj tego zamiast tego i możesz znaleźć rozwiązanie bez znajomości problemu. – Connor

Odpowiedz

0

Bez widząc .csv nie możemy naprawdę pomóc Ci zbyt wiele, ale ...

  1. Upewnij się, że każda linia w pliku CSV ma prawidłowy format
  2. Upewnij się, że ostatnia linia w pliku csv to nie tylko biała spacja.
  3. Spójrz na opcjonalnych parametrów the documentation for csv.reader konkretnie newline=''
+0

Cześć Vikram, Dzięki za sugestię.Plik ma poprawny format i nie kończy się białymi znakami (tylko zweryfikowanymi), powoduje załadowanie danych z pliku do tabeli produktów, jeśli zbiór danych jest mały, ale nie może załadować większego zestawu danych o tym samym formacie. –

+0

plik oczywiście nie ma poprawnego formatu lub nie otrzymasz tego błędu. Błąd wskazuje, że istnieje linia z mniej niż 8 polami. – Barmar

+0

@Barmar Dzięki Barmar/Vikram, jego dość duży plik, stworzyłem około 7-8 oddzielnych plików z tego dużego pliku, aby wykonać testy, zobaczę sposób weryfikacji całego pliku, jeśli są wiersze z niepoprawnym formatem, ten plik danych jest bezpośrednim ekstraktem z narzędzia o nazwie Ab Initio, które przekształca plik po sprawdzeniu poprawności, poinformuje o aktualizacji. –

2

Są oczywiście mniej niż 8 kolumn dla dotkniętego rzędu. Debug za pomocą try/except bloku:

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

Jako bonus, tutaj jest bardziej efektywny sposób, aby napisać kod:

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

Dzięki Alexander za edycję! Testowanie kodu, pozwoli ci poznać aktualizację. –

+0

Powinieneś używać dyktowania przez miesiące zamiast 'index()'. Coś jak 'miesiące = {'JAN': 1, 'FEB': 2, ...}' to możesz po prostu zrobić 'dla wiersza w recReader: period_num = months.get (row [7], None)'. 'index()' musi przejść przez listę za każdym razem, aby uzyskać indeks, podczas gdy dicty mają wyszukiwanie O (1). – IanAuld

+0

@IanAuld Dzięki za informacje Ian, Havenot użyłem Dict wcześniej, pozwól mi spróbować dyktować tego podejścia, poinformuje Cię aktualizacja. –

Powiązane problemy