Flume拦截器在读取时忽略输入CSV文件头

时间:2016-12-19 09:34:26

标签: java flume

我的输入文件为:

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-INTERCEPTOR进行此文件转换和输出文件移动。

我写了下面的逻辑。但是有一个明显的异常"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();

1 个答案:

答案 0 :(得分:1)

您可以使用DateFormat

.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