我尝试为读取行创建示例自定义处理器,并在输入行中进行一些更改,然后处理成流程文件。
这是我读取流文件的代码。
String inputRow;
session.read(flowFile, new InputStreamCallback() {
@Override
public void process(InputStream in) throws IOException {
inputRow = IOUtils.toString(in);
}
});
从下面的参考文献中观察到该代码。
http://www.nifi.rocks/developing-a-custom-apache-nifi-processor-json/
读取行后,我无法根据LineFeed字符拆分这些行。
我的处理器的上游连接产生低于我的样本输入。
我的示例输入行:
No,Name,value
1,Si,21
2,LI,321
3,Ji,11
以上行可以存储在“inputRow”。
但我使用下面的代码根据'\ n'分割它。
String[] splits=inputRow.split("\n");
我试过'\ n'和'\ r \ n'来分割这些行,但它没有用。
任何人都请指导我将这些行拆分为预期的输出。
splits[0]=No,Name,value
splits[1]=1,Si,21
splits[2]=2,LI,321
splits[3]=3,Ji,11
任何帮助表示感谢。
答案 0 :(得分:4)
如另一个答案所述,您应该能够使用BufferedReader逐行读取。您还应该尽可能避免将流文件的全部内容加载到内存中。
想象一下,这款NiFi处理器正在处理1GB CSV文件,并且可以同时处理2-3个文件。如果将整个流文件内容读入内存,则如果分配给JVM的堆少于3GB,则会触发内存不足。如果逐行流式传输每个文件,一次只能在内存中有2-3行,并且只需要很少的总内存。
以下代码段显示了如何在一行中读取,处理并将其写出来,而不必将所有内容都放在内存中:
flowFile = session.write(flowFile, new StreamCallback() {
@Override
public void process(InputStream in, OutputStream out) throws IOException {
try (InputStreamReader inReader = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(inReader);
OutputStreamWriter outWriter = new OutputStreamWriter(out);
BufferedWriter writer = new BufferedWriter(outWriter)) {
String line = reader.readLine();
while (line != null) {
line = process(line);
writer.write(line);
writer.newLine();
line = reader.readLine();
}
}
}
});
答案 1 :(得分:2)
您可以使用此正则表达式进行拆分:\\r?\\n
。
String[] splits = inputRow.split("\\r?\\n");
答案 2 :(得分:2)
为什么要把所有东西都推成一个字符串?只是逐行阅读;并将那些行推到列表中:
List<String> inputRows = new ArrayList<>();
...
在你的回调中你使用像这样的BufferedReader:
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
while ((line = reader.readLine()) != null) {
inputRows.add(line);
}