【发布时间】:2020-03-01 14:09:05
【问题描述】:
我有一个 70 列的 csv。第 60 列包含一个值,该值决定记录是valid 还是invalid。如果第 60 列有 0、1、6 或 7,则为 valid。如果它包含任何其他值,那么它的invalid。
我意识到这个功能不可能完全依赖于改变 Apache NiFi 中处理器的属性。因此,我决定使用executeScript processor 并将此 python 代码添加为文本正文。
import csv
valid =0
invalid =0
total =0
file2 = open("invalid.csv","w")
file1 = open("valid.csv","w")
with open('/Users/himsaragallage/Desktop/redder/Regexo_2019101812750.dat.csv') as f:
r = csv.reader(f)
for row in f:
# print row[1]
total +=1
if row[59] == "0" or row[59] == "1" or row[59] == "6" or row[59] == "7":
valid +=1
file1.write(row)
else:
invalid += 1
file2.write(row)
file1.close()
file2.close()
print("Total : " + str(total))
print("Valid : " + str(valid))
print("Invalid : " + str(invalid))
我不知道如何在 executeScript 处理器中使用会话和代码,如this question 所示。所以我只是写了一个简单的python代码,并将有效和无效数据定向到不同的文件。我使用的这种方法有许多限制。
- 我希望能够动态处理具有不同文件名的 csv。
- 发送无效数据的 csv 文件名也必须与输入 csv 文件名相同。
- 我的
redder文件夹中大约有 20 个 csv。必须一次性处理所有这些。
希望您能建议我执行以下操作的方法。随时通过编辑我使用的python代码甚至完全使用不同的处理器集并完全排除ExecuteScript Processer的使用来为我提供解决方案@
【问题讨论】:
-
您可以查看 QueryRecord 处理器,而不是在 Jython 脚本中执行此操作。使用该处理器,您将能够简单地编写一个新关系,即“select * from FLOWFILE where column60 in (0,1,6,7)”
-
@Pushkr 您能否清楚在 QueryRecord 处理器中哪些属性/配置必须更改为“select * from FLOWFILE where column60 in (0,1,6,7) ”。
标签: python csv apache-nifi data-cleaning