У меня есть CSV-файл с более чем 70 столбцами и миллионами записей. Но для обработки мне нужно около 20 столбцов. Чтобы извлечь их, я использовал модифицированный скрипт groovy
в Разделенные поля и NiFi API с Groovy .
Мой скрипт:
import java.nio.charset.StandardCharsets
def flowFile = session.get()
if(!flowFile) return
flowFile = session.write(flowFile, {inputStream, outputStream ->
inputStream.eachLine { line ->
a = line.tokenize(',')
outputStream.write("${a[0]},${a[1]},${a[2]},${a[3]},${a[4]}\n".toString().getBytes(StandardCharsets.UTF_8))
}
} as StreamCallback)
session.transfer(flowFile, REL_SUCCESS)
Оригинал csv:
date,id,name,age,addr,lang
19/12/2019,1,sachith,29,sac@email,go
,2,nalaka,29,nalaka@email,
,,muhandiram,,c
Когда это обрабатывается процессором ExecuteScript
, вывод выглядит следующим образом:
date,id,name,age
19/12/2019,1,sachith,29
2,2,nalaka,29
null,null,muhandiram,null
Если поле данных пустое, оно заменяется на id
, а другие пустые значения заменяются на null
.
Почему скрипт плохо себя ведет? Мои знания о groovy
почти ничего.
ожидаемый результат:
date,id,name,age
19/12/2019,1,sachith,29
,2,nalaka,29
,,muhandiram,