Не поврежден ли "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.
Это ошибка в библиотеке, или я что-то упустил?