如何根据'\ n'拆分我的流文件内容?

时间:2017-02-28 13:28:54

标签: java split apache-nifi

我尝试为读取行创建示例自定义处理器,并在输入行中进行一些更改,然后处理成流程文件。

这是我读取流文件的代码。

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

任何帮助表示感谢。

3 个答案:

答案 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);
 }