flume拦截器在读取时忽略输入csv文件头

k2arahey  于 2021-06-04  发布在  Flume
关注(0)|答案(1)|浏览(410)

我的输入文件显示:

Name,Age,Date
abc,26,2016-12-16 00:00:01
pqr,25,2016-12-17 12:00:00

我的输出文件必须是:

Name,Age,Date
ABC,26,2016-12-16 05:30:01
PQR,25,2016-12-17 17:30:00

我正在使用flume拦截器进行文件转换和输出文件移动。
我写了下面的逻辑。但有一个明显的例外 "Cannot parse Date". 基本上,我必须忽略输入文件头,即 Name,Age,Date . 如何实现这一点与我下面的代码

SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date =new Date();

        String line = new String(startEventBody);

        String[] token = line.split(",");
        date=a.parse(token[2]);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR_OF_DAY, 5);
        cal.add(Calendar.MINUTE, 30);

        String b = a.format(cal.getTime()).toString();

        token[0] = token[0].toUpperCase();
        token[2]=token[2].replace(token[2], b);

        String newLine = "";
        for (String s : token) {
            newLine += s + ",";
        }

        newLine = newLine.replaceAll("\\r\\n|\\r|\\n", "");

        this.outputStream = new ByteArrayOutputStream(newLine.getBytes().length);

        this.outputStream.write(newLine.getBytes());

        return this.outputStream.toByteArray();
gfttwv5a

gfttwv5a1#

你可以用 .setLenient 日期格式
在不离开标题的第一行的情况下,您可以检查日期格式的健全性,如下所示

...

SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
a.setLenient(false);
Date date =new Date();
String line = new String(startEventBody);
String[] token = line.split(",");
if(a.parse(token[2], new ParsePosition(0)) != null){
  date = a.parse(token[2]);
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  cal.add(Calendar.HOUR_OF_DAY, 5);
  cal.add(Calendar.MINUTE, 30);
  token[2] = a.format(cal.getTime()).toString(); //rewrites new date string to token[2] 
}

token[0] = token[0].toUpperCase();

...

注意:当然你也可以检查
String Date 而不是 DateFormat .

相关问题