2015-09-17 3 views
5

Я работаю с продуктом Oracle EPM под названием «Управление данными о финансовых данных Enterprise Edition» (FDMEE). Я написал сценарий Jython для синтаксического анализа файла данных и нажатия его на пользовательскую таблицу в схеме продукта FDMEE.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-й элемент списка. Каков ожидаемый результат? Проверьте его и попробуйте отследить. –

+0

Кроме того, прочитайте документацию Pandas [здесь] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html) и работайте с файловыми кадрами, они намного лучше для этой цели. –

+0

У меня не было много времени, чтобы посмотреть на ваш код, но я бы предложил использовать Dict_Reader из модуля csv, чтобы вы могли посмотреть, что столбец по имени столбца скорее по индексу. Попробуйте это вместо этого, и вы можете найти решение, не зная о проблеме – Connor

ответ

0

не видя ваше .csv мы не можем реально помочь вам слишком много, но ...

  1. Убедитесь, что каждая строка в вашем CSV имеет правильный формат
  2. Убедитесь, что последняя строка в вашем csv не просто пробельная.
  3. Посмотрите на необязательных параметров в the documentation for csv.reader, в частности newline=''
+0

Привет Викрам, спасибо за предложение.Файл имеет правильный формат и не заканчивается пробелом (только что подтвержденным). Он загружает данные из файла в таблицу продуктов, если набор данных невелик, но не загружает более крупный набор данных того же формата. –

+0

файл явно не имеет правильного формата или вы не получите эту ошибку. Ошибка указывает, что существует строка с менее чем 8 полями. – Barmar

+0

@Barmar Спасибо Barmar/Vikram, его довольно большой файл, я создал около 7-8 отдельных файлов из этого большого файла для выполнения тестов, позвольте мне посмотреть способ проверки всего файла, если есть строки с неправильным форматом, этот файл данных является прямым извлечением из инструмента Ab Initio, который преобразует файл после проверки, сообщит вам об этом. –

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

Спасибо Александру за редактирование! Тестирование кода позволит вам узнать об этом. –

+0

Вы должны использовать dict в течение месяцев вместо 'index()'. Что-то вроде 'months = {'JAN': 1, 'FEB': 2, ...}' то вы можете просто сделать 'для строки в recReader: period_num = months.get (row [7], None)'. 'index()' нужно каждый раз проходить через список, чтобы получить индекс, в то время как dicts имеет O (1) поиск. – IanAuld

+0

@IanAuld Спасибо за информацию. Янь, Хэвенот использовал dict раньше, позвольте мне попробовать dict для этого подхода, сообщит вам об обновлении. –

Смежные вопросы