Вы можете читать файлы CSV с помощью univocity-parsers.
Мы все еще работаем над версией 2.0, в которой представлено автоматическое определение формата, но вы уже можете получить версию моментального снимка и использовать ее для решения этой проблемы.
Простой пример:
public static void main(String... args) {
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.detectFormatAutomatically();
List<String[]> rows = new CsvParser(parserSettings).parseAll(new StringReader("Amount,Tax,Total\n1.99,10.0,2.189\n5,20.0,6"));
for (Object[] row : rows) {
System.out.println(Arrays.toString(row));
}
System.out.println("####");
rows = new CsvParser(parserSettings).parseAll(new StringReader("Amount;Tax;Total\n1,99;10,0;2,189\n5;20,0;6"));
for (Object[] row : rows) {
System.out.println(Arrays.toString(row));
}
}
Выход:
[Amount, Tax, Total]
[1.99, 10.0, 2.189]
[5, 20.0, 6]
####
[Amount, Tax, Total]
[1,99, 10,0, 2,189]
[5, 20,0, 6]
Вы можете получить последнюю версию моментального снимка по адресу . здесь.
Или, если вы используете maven, добавьте это в свой pom.xml:
<repositories>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
</repositories>
И установите версию 2.0.0-SNAPSHOT:
<dependency>
<groupId>com.univocity</groupId>
<artifactId>univocity-parsers</artifactId>
<version>2.0.0-SNAPSHOT</version>
</dependency>
Если вы обнаружите какую-либо проблему, просто откройте новую задачу на странице проекта github.
Изменить: еще один пример, демонстрирующий, как вы можете преобразовать свои входные строки в BigDecimal, используя несколько средств форматирования:
public static void main(String... args) {
// ObjectRowListProcessor converts the parsed values and stores the result in a list.
ObjectRowListProcessor rowProcessor = new ObjectRowListProcessor();
FormattedBigDecimalConversion conversion = new FormattedBigDecimalConversion();
conversion.addFormat("0.00", "decimalSeparator=.");
conversion.addFormat("0,00", "decimalSeparator=,");
// Here we convert fields at columns 0, 1 and 2 to BigDecimal, using two possible input formats
rowProcessor.convertIndexes(conversion).set(0, 1, 2);
// Create a settings object to configure the CSV parser
CsvParserSettings parserSettings = new CsvParserSettings();
//I'll separate the values using | to make it easier for you to identify the values in the input
parserSettings.getFormat().setDelimiter('|');
// We want to use the RowProcessor configured above to parse our data
parserSettings.setRowProcessor(rowProcessor);
// Create the parser
CsvParser parser = new CsvParser(parserSettings);
// Parse everything. All rows are sent to the rowProcessor configured above
parser.parse(new StringReader("1.99|10.0|2.189\n1,99|10,0|2,189"));
// Let's get the parsed rows
List<Object[]> rows = rowProcessor.getRows();
for (Object[] row : rows) {
System.out.println(Arrays.toString(row));
}
}
И вот результат: 2 массива с объектами BigDecimal и правильными значениями:
[1.99, 10.0, 2.189]
[1.99, 10.0, 2.189]
person
Jeronimo Backes
schedule
17.06.2015
dfs.getDecimalSeparator()
, что для английского языка может привести к выражению, подобному\d+(\.\d{1,2})?
, которое позволит использовать целые и десятичные значения, используя точку в качестве десятичного разделителя и допуская от 1 до 2 дробных цифр. - person Thomas   schedule 16.06.2015,
является разделителем между столбцами или символом числа? - person Tom   schedule 16.06.2015