Не поврежден ли "withAllowMissingColumnNames( false)" в библиотеке Apache Commons CSV?

Я экспериментировал с библиотекой Apache Commons CSV, чтобы определить, обнаружит ли она файл CSV, который не соответствует стандарту RFC 4180.

➥ вызов .withAllowMissingColumnNames ( false ) к моему CSVFormat объект, кажется, не имеет никакого эффекта. Когда я удаляю элементы из строки заголовка моего входного файла, библиотека обрабатывает файл, а не жалуется.

Вот мои два входных файла, идентичные за исключением того, что я удалил один элемент (, uuid) из строки заголовка.

id,instant,uuid
1,2019-08-18T19:52:59.764137Z,f13389ea-c4a5-4bca-8c9f-2c7486110b68
2,2019-08-18T19:52:59.790896Z,56f3f3f1-92ec-4861-b987-e79c8504e45e
3,2019-08-18T19:52:59.791014Z,07444d71-e396-47fe-b03c-5754145fc50d

…а также…

id,instant
1,2019-08-18T19:52:59.764137Z,f13389ea-c4a5-4bca-8c9f-2c7486110b68
2,2019-08-18T19:52:59.790896Z,56f3f3f1-92ec-4861-b987-e79c8504e45e
3,2019-08-18T19:52:59.791014Z,07444d71-e396-47fe-b03c-5754145fc50d

Вот полное приложение, которое анализирует оба файла.

package work.basil.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.time.Instant;
import java.util.UUID;

public class VerifyRfc4180
{
    public static void main ( String[] args )
    {
        VerifyRfc4180 app = new VerifyRfc4180 ();

        System.out.println ( "Reading good file." );
        app.read ( VerifyRfc4180.PATH_GOOD );

        System.out.println ( "Reading bad file." );
        app.read ( VerifyRfc4180.PATH_BAD );

        System.out.println ( "Done reading good & bad files." );
    }

    static final private String PATH_GOOD = "/Users/basilbourque/csv-good.txt";
    static final private String PATH_BAD = "/Users/basilbourque/csv-bad.txt";

    private void read ( String pathText )
    {
        Instant start = Instant.now ();

        int count = 0;
        Path path = Paths.get ( pathText );
        try (
                Reader reader = Files.newBufferedReader ( path , StandardCharsets.UTF_8 ) ;
        )
        {
            CSVFormat format = CSVFormat.RFC4180.withFirstRecordAsHeader ().withAllowMissingColumnNames ( false );
            CSVParser parser = CSVParser.parse ( reader , format );
            for ( CSVRecord csvRecord : parser )
            {
                Integer id = Integer.valueOf ( csvRecord.get ( 0 ) ); // Annoying zero-based index counting.
                Instant instant = Instant.parse ( csvRecord.get ( 1 ) );
                UUID uuid = UUID.fromString ( csvRecord.get ( 2 ) );
            }
        } catch ( IOException e )
        {
            e.printStackTrace ();
        }

        System.out.println ( "Read CSV for count: " + count );
        System.out.println ( "Elapsed: " + Duration.between ( start , Instant.now () ) );
    }

}

Я прошел false на линии:

CSVFormat format = 
    CSVFormat
    .RFC4180
    .withFirstRecordAsHeader ()
    .withAllowMissingColumnNames ( false )
;

Javadoc говорит, что я должен увидеть IllegalArgumentException выброшены. Но я не.

Значение true, чтобы разрешить отсутствующие имена столбцов в строке заголовка, значение false, чтобы вызвать исключение IllegalArgumentException.

Это ошибка в библиотеке, или я что-то упустил?

0 ответов

Другие вопросы по тегам