2016-08-22 7 views
0

Я хочу написать UDF питон для свиней, чтобы читать строки из файла под названием какUDF (User Defined Function) питон дает другой ответ на свинье

#'prefix.csv' 
spol. 
LLC 
Oy 
OOD 

и совпадают с именами и если находят любые матчи, затем заменяет его пробелом. вот мой питон код

def list_files2(name, f): 
    fin = open(f, 'r') 
    for line in fin: 
     final = name 
     extra = 'nothing' 
     if (name != name.replace(line.strip(), ' ')): 
      extra = line.strip() 
      final = name.replace(line.strip(), ' ').strip() 
      return final, extra,'insdie if' 
    return final, extra, 'inside for' 

Выполнение этого кода в Python,

>print list_files2('LLC nakisa', 'prefix.csv') 
>print list_files2('AG company', 'prefix.csv') 

возвращает

('nakisa', 'LLC', 'insdie if') 
('AG company', 'nothing', 'inside for') 

это именно то, что мне нужно. Но когда я зарегистрировать этот код как UDF в апаче свиньи для этого списка выборки:

nakisa company LLC 
three Oy 
AG Lans 
Test OOD 

свинья возвращает неправильный ответ на третьей строке:

((nakisa company,LLC,insdie if)) 
((three,Oy,insdie if)) 
((A G L a n s,,insdie if)) 
((Test,OOD,insdie if)) 

Вопрос в том, почему UDF входит если цикл для третья запись, которая не имеет никакого соответствия в файле prefix.csv.

ответ

0

Я не знаю pig, но как вы проверяете соответствие, это странно и может быть причиной вашей проблемы.

Если вы хотите, чтобы проверить строка является ли подстрока другого, python обеспечивает в find метод на строках:

if name.find(line.strip()) != -1: 
    # find will return the first index of the substring or -1 if it was not found 
    # ... do some stuff 

кроме того, ваш код может оставить файл обрабатывать открытым. Лучшим способом управления файловыми операциями является использование инструкции with. Это гарантирует, что в любом случае (кроме сбоев интерпретатора) дескриптор файла будет закрыт.

with open(filename, "r") as file_: 
    # Everything within this block can use the opened file. 

И последнее, но не в последнюю очередь, python предоставляет модуль под названием csv с reader и writer, что обрабатывать разбор формата CSV-файл.

Таким образом, вы можете попробовать следующий код и проверить, если он возвращает правильную вещь:

import csv 

def list_files2(name, filename): 
    with open(filename, 'rb') as file_: 
     final = name 
     extra = "nothing" 
     for prefix in csv.reader(file_): 
      if name.find(prefix) != -1: 
       extra = prefix 
       final = name.replace(prefix, " ") 
       return final, extra, "inside if" 
     return final, extra, "inside for" 

Поскольку файл называется prefix.csv Я предполагаю, что вы хотите сделать подстановку префиксов. В этом случае вы можете использовать startswith вместо find для проверки и заменить линию final = name.replace(prefix, " ") на final = " " + name[name.find(prefix):]. Это гарантирует, что только префикс будет заменен пробелом.

Я надеюсь, что это помогает

+0

Привет, команда с открытым (имя файла, «г»), как file_: не может быть использован в свинью. Он дает эту ошибку: Синтаксическая ошибка: «с» станет зарезервированным ключевым словом в Python 2.6 – nakisa

+0

Я пробовал код с именем.find (prefix)! = -1, python работает, но свиньи нет! – nakisa

+0

Хорошо, какую версию 'python' вы используете локально? и какая версия использует 'свиньи? Может быть, это проблема? Кажется, что ваша 'свинья' использует VERRY old' python 2.5' или что-то в этом роде –

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

  • Нет связанных вопросов^_^