我想为pig编写一个UDF python来读取名为
的文件中的行#'prefix.csv'
spol.
LLC
Oy
OOD
并匹配名称,如果找到任何匹配项,则将其替换为空格。这是我的python代码
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')
这正是我需要的。但是当我在这个样本列表的apache pig中将此代码注册为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文件中没有任何匹配的第三个条目输入if循环。
答案 0 :(得分: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):]
。这样可以确保只用空格替换前缀。
我希望,这有助于