我问了类似的问题。但是,我无法通过这种方法找到解决问题的方法。我有一个csv,看起来像这样:
studentID,regger,age,number
123,west,12,076392367
456,nort,77,098123124
231,west,33,076346325
我想添加一个新列并根据数字字段中的数据添加值。这是逻辑。
If the first 4 digits of data in the number column is equal to "0763" then the new column named (status) must be set as INSIDE or if it is any other value its OUTSIDE
如逻辑中所述,输出必须如下所示:
studentID,regger,age,number,status
123,west,12,076392367,INSIDE
456,nort,77,098123124,OUTSIDE
231,west,33,076346325,INSIDE
我的方法
我试图通过首先将数字列复制到状态列来实现此目的。然后尝试取前4位数字并进行处理。
希望您可以为Nifi Workflow提出一种建议,以实现这一目标。
答案 0 :(得分:2)
您可以尝试以下逻辑:-
SplitText-> ExtractText处理器-> RouteOnAttribute(如果前四个数字为0763,则添加条件)
-----匹配关系-> ReplaceText(从文件中提取的属性+“ INSIDE”)-> PutFile
-----不匹配关系-> ReplaceText(从文件中提取属性+“ OUTSIDE”)-> PutFile
希望这会对您有所帮助。
答案 1 :(得分:2)
我两次使用UpdateRecord
处理器,并获得了所需的结果。
输入
我从您的输入数据开始。
studentID,regger,age,number
123,west,12,076392367
456,nort,77,098123124
231,west,33,076346325
过程
首先,如下设置UpdateRecord
处理器:
Record Reader CSVReader
Record Writer CSVRecordSetWriter
Replacement Value Strategy Record Path Value
/status /number
它将创建具有列status
的值的新列number
。
第二,第一个输出应转到带有选项的另一个UpdateRecord
处理器
Record Reader CSVReader
Record Writer CSVRecordSetWriter
Replacement Value Strategy Literal Value
/status ${field.value:substring(0,4):equals('0763'):ifElse(${field.value:replace(${field.value},'INSIDE')},${field.value:replace(${field.value},'OUTSIDE')})}
这将为您提供最终结果。
请注意,数字列不是整数列,因此必须将记录读取器CSVReader
的选项Schema Access Strategy
设置为Use String Fields From Header
。
输出
studentID,regger,age,number,status
123,west,12,076392367,INSIDE
456,nort,77,098123124,OUTSIDE
231,west,33,076346325,INSIDE