使用Csv解析器的Java-CSV Date

时间:2014-12-09 11:30:28

标签: java

我有一个CSV文件,我试图使用java导入。包含不同格式的日期列和日期的文件我想解析适合myqsl的日期。

我的代码为:

CSVFormat format = CSVFormat.RFC4180.withHeader().withDelimiter(',');
CSVParser parsernew =CSVParser(File, format)
List<CSVRecord> csvRecordList = parser.getRecords();
String cellvalue=csvRecordList.get(0);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat .parse(cellvalue);

我尝试解析日期列值但得到了异常

java.text.ParseException: Unparseable date:

日期列值如

10/31/2014
12/13/2013
2001-02-04
7/27/2001
2001-02-04
5/15/2008

有没有办法解析不同的日期格式和日期格式更改运行时间如何处理..

in excel

谢谢!

2 个答案:

答案 0 :(得分:0)

修复数据源

首先,在将日期时间值序列化为文本时,应该仅使用标准的ISO 8601格式来教育该数据的发布者。对于没有日期和时区的仅日期,则为YYYY-MM-DD。

尝试解析两种已知格式中的每一个

幸运的是,您的示例数据仅显示两种格式:标准YYYY-MM-DD格式和M / D / YYYY。

因此,请尝试使用一对格式化程序进行解析,每种情况下一个。如果两者均失败,请抛出异常,以提醒您不幸地使用了出版商的更多格式。

java.time

仅使用 java.time 类。切勿使用可怕的旧日期时间类,例如DateDateFormat。这些遗留类在几年前被Java 8及更高版本中的JSR 310所取代。

DateTimeFormatter

定义一对格式化程序。标准的一个已经定义为常量DateTimeFormatter.ISO_LOCAL_DATE。定义另一个。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/uuuu" ) ;

使用Apache Commons CSV库在代码中获取输入字符串。但是您的代码在Question中看起来是错误的。您需要为列表中的每个CSVRecord对象添加一个循环。然后从该对象表示的每一行中提取每一列。

CSVRecord record = = csvRecordList.get( i ) ;  // Fetch nth object from list.
String cellvalue = csvRecordList.get( 0 ) ;    // Extract each column/cell from each row/object. Must use annoying zero-based index counting.

赶上DateTimeParseException

尝试使用LocalDate.parse使用两个格式化程序中的每一个解析输入。赶上DateTimeParseException

LocalDate ld = null;

if( Objects.isNull( ld ) ) {
    try {
        ld = LocalDate.parse( cellvalue , DateTimeFormatter.ISO_LOCAL_DATE ) ;
    } catch ( DateTimeParseException e ) {
        // Swallow this particular exception in this particular case.
    }
}

if( Objects.isNull( ld ) ) {
    try {
        ld = LocalDate.parse( cellvalue , f ) ;
    } catch ( DateTimeParseException e ) {
        // Swallow this particular exception in this particular case.
    }
}

if( Objects.isNull( ld ) ) {
    // Yikes! Failing all parsing attempts above means we encountered an unexpected format. 
    // FIXME: Handle this error scenario.
}

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

您可以使用 SimpleFlatMapper 来定义不同的日期格式。

举个例子:

CsvParser.mapWith(CsvMapperFactory.newInstance()
    .addColumnProperty(k -> k.getName().toLowerCase().contains("date"), new DateFormatProperty("dd/MM/yyyy"))
    .addColumnProperty(k -> k.getName().toLowerCase().contains("date"), new DateFormatProperty("dd-MM-yyyy"))
    .newMapper(Trade.class))
    .stream(reader).collect(toList());