/** * Gets a single field value from the row by header pattern * <p> * This returns the value of the first column where the header matches the specified header pattern. * If the header is not found or the value found is an empty string, then an IllegalArgumentException is thrown. * * @param headerPattern the header pattern to match * @return the trimmed field value * @throws IllegalArgumentException if the header is not found or if the value in the field is empty. */ public String getValue(Pattern headerPattern) { String value = getField(headerPattern); if (value.isEmpty()) { throw new IllegalArgumentException("No value was found for header pattern: '" + headerPattern + "'"); } return value; }
/** * Gets a single field value from the row by header * <p> * This returns the value of the first column where the header matches the specified header. * If the header is not found or the value found is an empty string, then an IllegalArgumentException is thrown. * * @param header the column header * @return the trimmed field value, empty * @throws IllegalArgumentException if the header is not found or if the value in the field is empty. */ public String getValue(String header) { String value = getField(header); if (value.isEmpty()) { throw new IllegalArgumentException("No value was found for field: '" + header + "'"); } return value; }
private static void parseCurveMaps( CharSource groupsCharSource, Map<CurveGroupName, Map<Pair<RepoGroup, Currency>, CurveName>> repoGroups, Map<CurveGroupName, Map<Pair<LegalEntityGroup, Currency>, CurveName>> legalEntityGroups) { CsvFile csv = CsvFile.of(groupsCharSource, true); for (CsvRow row : csv.rows()) { String curveGroupStr = row.getField(GROUPS_NAME); String curveTypeStr = row.getField(GROUPS_CURVE_TYPE); String referenceStr = row.getField(GROUPS_REFERENCE); String currencyStr = row.getField(GROUPS_CURRENCY); String curveNameStr = row.getField(GROUPS_CURVE_NAME); CurveName curveName = CurveName.of(curveNameStr); createKey( curveName, CurveGroupName.of(curveGroupStr), curveTypeStr, referenceStr, currencyStr, repoGroups, legalEntityGroups); } }
private static SwapIndex parseSwapIndex(CsvRow row) { String name = row.getField(NAME_FIELD); boolean active = Boolean.parseBoolean(row.getField(ACTIVE_FIELD)); FixedIborSwapConvention convention = FixedIborSwapConvention.of(row.getField(CONVENTION_FIELD)); Tenor tenor = Tenor.parse(row.getField(TENOR_FIELD)); LocalTime time = LocalTime.parse(row.getField(FIXING_TIME_FIELD), TIME_FORMAT); ZoneId zoneId = ZoneId.of(row.getField(FIXING_ZONE_FIELD)); // build result return ImmutableSwapIndex.builder() .name(name) .active(active) .fixingTime(time) .fixingZone(zoneId) .template(FixedIborSwapTemplate.of(tenor, convention)) .build(); }
private static void parseSingle( Predicate<LocalDate> datePredicate, CharSource resource, Map<LocalDate, ImmutableMap.Builder<QuoteId, Double>> mutableMap) { try { CsvFile csv = CsvFile.of(resource, true); for (CsvRow row : csv.rows()) { String dateText = row.getField(DATE_FIELD); LocalDate date = LoaderUtils.parseDate(dateText); if (datePredicate.test(date)) { String symbologyStr = row.getField(SYMBOLOGY_FIELD); String tickerStr = row.getField(TICKER_FIELD); String fieldNameStr = row.getField(FIELD_NAME_FIELD); String valueStr = row.getField(VALUE_FIELD); double value = Double.valueOf(valueStr); StandardId id = StandardId.of(symbologyStr, tickerStr); FieldName fieldName = fieldNameStr.isEmpty() ? FieldName.MARKET_VALUE : FieldName.of(fieldNameStr); ImmutableMap.Builder<QuoteId, Double> builderForDate = mutableMap.computeIfAbsent(date, k -> ImmutableMap.builder()); builderForDate.put(QuoteId.of(id, fieldName), value); } } } catch (RuntimeException ex) { throw new IllegalArgumentException( Messages.format("Error processing resource as CSV file: {}", resource), ex); } }
/** * Parses the curve groups definition CSV file. * <p> * The list of {@link NodalCurveDefinition} will be empty in the resulting definition. * * @param groupsCharSource the curve groups CSV character source * @return the list of definitions */ public static List<RatesCurveGroupDefinition> parseCurveGroupDefinitions(CharSource groupsCharSource) { Map<CurveName, Set<GroupAndReference>> curveGroups = new LinkedHashMap<>(); CsvFile csv = CsvFile.of(groupsCharSource, true); for (CsvRow row : csv.rows()) { String curveGroupStr = row.getField(GROUPS_NAME); String curveTypeStr = row.getField(GROUPS_CURVE_TYPE); String referenceStr = row.getField(GROUPS_REFERENCE); String curveNameStr = row.getField(GROUPS_CURVE_NAME); GroupAndReference gar = createKey(CurveGroupName.of(curveGroupStr), curveTypeStr, referenceStr); CurveName curveName = CurveName.of(curveNameStr); curveGroups.computeIfAbsent(curveName, k -> new LinkedHashSet<>()).add(gar); } return buildCurveGroups(curveGroups); }
/** * Parses the seasonality definition CSV file. * * @param charSource the seasonality CSV character source * @return the map of seasonality definitions */ public static Map<CurveName, SeasonalityDefinition> parseSeasonalityDefinitions(CharSource charSource) { ImmutableMap.Builder<CurveName, SeasonalityDefinition> builder = ImmutableMap.builder(); CsvFile csv = CsvFile.of(charSource, true); for (CsvRow row : csv.rows()) { String curveNameStr = row.getField(CURVE_NAME); String shiftTypeStr = row.getField(SHIFT_TYPE); DoubleArray values = DoubleArray.of(12, i -> Double.parseDouble(row.getField(MONTH_PAIRS.get(i)))); CurveName curveName = CurveName.of(curveNameStr); ShiftType shiftType = ShiftType.valueOf(shiftTypeStr.toUpperCase(Locale.ENGLISH)); builder.put(curveName, SeasonalityDefinition.of(values, shiftType)); } return builder.build(); }
private static Multimap<LocalDate, Curve> parseSingle( Predicate<LocalDate> datePredicate, CharSource curvesResource, Map<CurveName, LoadedCurveSettings> settingsMap) { CsvFile csv = CsvFile.of(curvesResource, true); Map<LoadedCurveKey, List<LoadedCurveNode>> allNodes = new HashMap<>(); for (CsvRow row : csv.rows()) { String dateStr = row.getField(CURVE_DATE); String curveNameStr = row.getField(CURVE_NAME); String pointDateStr = row.getField(CURVE_POINT_DATE); String pointValueStr = row.getField(CURVE_POINT_VALUE); String pointLabel = row.getField(CURVE_POINT_LABEL); LocalDate date = LoaderUtils.parseDate(dateStr); if (datePredicate.test(date)) { LocalDate pointDate = LoaderUtils.parseDate(pointDateStr); double pointValue = Double.valueOf(pointValueStr); LoadedCurveKey key = LoadedCurveKey.of(date, CurveName.of(curveNameStr)); List<LoadedCurveNode> curveNodes = allNodes.computeIfAbsent(key, k -> new ArrayList<>()); curveNodes.add(LoadedCurveNode.of(pointDate, pointValue, pointLabel)); } } return buildCurves(settingsMap, allNodes); }
private static Multimap<LocalDate, Curve> parseSingle( Predicate<LocalDate> datePredicate, CharSource curvesResource, Map<CurveName, LoadedCurveSettings> settingsMap) { CsvFile csv = CsvFile.of(curvesResource, true); Map<LoadedCurveKey, List<LoadedCurveNode>> allNodes = new HashMap<>(); for (CsvRow row : csv.rows()) { String dateStr = row.getField(CURVE_DATE); String curveNameStr = row.getField(CURVE_NAME); String pointDateStr = row.getField(CURVE_POINT_DATE); String pointValueStr = row.getField(CURVE_POINT_VALUE); String pointLabel = row.getField(CURVE_POINT_LABEL); LocalDate date = LoaderUtils.parseDate(dateStr); if (datePredicate.test(date)) { LocalDate pointDate = LoaderUtils.parseDate(pointDateStr); double pointValue = Double.valueOf(pointValueStr); LoadedCurveKey key = LoadedCurveKey.of(date, CurveName.of(curveNameStr)); List<LoadedCurveNode> curveNodes = allNodes.computeIfAbsent(key, k -> new ArrayList<>()); curveNodes.add(LoadedCurveNode.of(pointDate, pointValue, pointLabel)); } } return buildCurves(settingsMap, allNodes); }
private static PriceIndex parsePriceIndex(CsvRow row) { String name = row.getField(NAME_FIELD); Currency currency = Currency.parse(row.getField(CURRENCY_FIELD)); Country region = Country.of(row.getField(COUNTRY_FIELD)); boolean active = Boolean.parseBoolean(row.getField(ACTIVE_FIELD)); Frequency frequency = Frequency.parse(row.getField(PUBLICATION_FREQUENCY_FIELD)); // build result return ImmutablePriceIndex.builder() .name(name) .currency(currency) .region(region) .active(active) .publicationFrequency(frequency) .build(); }
private static Map<CurveName, LoadedCurveSettings> parseCurveSettings(CharSource settingsResource) { ImmutableMap.Builder<CurveName, LoadedCurveSettings> builder = ImmutableMap.builder(); CsvFile csv = CsvFile.of(settingsResource, true); for (CsvRow row : csv.rows()) { String curveNameStr = row.getField(SETTINGS_CURVE_NAME); String valueTypeStr = row.getField(SETTINGS_VALUE_TYPE); String dayCountStr = row.getField(SETTINGS_DAY_COUNT); String interpolatorStr = row.getField(SETTINGS_INTERPOLATOR); String leftExtrapolatorStr = row.getField(SETTINGS_LEFT_EXTRAPOLATOR); String rightExtrapolatorStr = row.getField(SETTINGS_RIGHT_EXTRAPOLATOR); if (!VALUE_TYPE_MAP.containsKey(valueTypeStr.toLowerCase(Locale.ENGLISH))) { throw new IllegalArgumentException( Messages.format("Unsupported {} in curve settings: {}", SETTINGS_VALUE_TYPE, valueTypeStr)); } CurveName curveName = CurveName.of(curveNameStr); ValueType valueType = VALUE_TYPE_MAP.get(valueTypeStr.toLowerCase(Locale.ENGLISH)); CurveInterpolator interpolator = CurveInterpolator.of(interpolatorStr); CurveExtrapolator leftExtrap = CurveExtrapolator.of(leftExtrapolatorStr); CurveExtrapolator rightExtrap = CurveExtrapolator.of(rightExtrapolatorStr); // ONE_ONE day count is not used DayCount dayCount = LoaderUtils.parseDayCount(dayCountStr); LoadedCurveSettings settings = LoadedCurveSettings.of( curveName, ValueType.YEAR_FRACTION, valueType, dayCount, interpolator, leftExtrap, rightExtrap); builder.put(curveName, settings); } return builder.build(); }
private static FxIndex parseFxIndex(CsvRow row) { String name = row.getField(NAME_FIELD); Currency baseCurrency = Currency.parse(row.getField(BASE_CURRENCY_FIELD)); Currency counterCurrency = Currency.parse(row.getField(COUNTER_CURRENCY_FIELD)); HolidayCalendarId fixingCal = HolidayCalendarId.of(row.getField(FIXING_CALENDAR_FIELD)); int maturityDays = Integer.parseInt(row.getField(MATURITY_DAYS_FIELD)); HolidayCalendarId maturityCal = HolidayCalendarId.of(row.getField(MATURITY_CALENDAR_FIELD)); // build result return ImmutableFxIndex.builder() .name(name) .currencyPair(CurrencyPair.of(baseCurrency, counterCurrency)) .fixingCalendar(fixingCal) .maturityDateOffset(DaysAdjustment.ofBusinessDays(maturityDays, maturityCal)) .build(); }
private static void parseSingle( Predicate<LocalDate> datePredicate, CharSource resource, Map<LocalDate, ImmutableMap.Builder<FxRateId, FxRate>> mutableMap) { try { CsvFile csv = CsvFile.of(resource, true); for (CsvRow row : csv.rows()) { String dateText = row.getField(DATE_FIELD); LocalDate date = LoaderUtils.parseDate(dateText); if (datePredicate.test(date)) { String currencyPairStr = row.getField(CURRENCY_PAIR_FIELD); String valueStr = row.getField(VALUE_FIELD); CurrencyPair currencyPair = CurrencyPair.parse(currencyPairStr); double value = Double.valueOf(valueStr); ImmutableMap.Builder<FxRateId, FxRate> builderForDate = mutableMap.computeIfAbsent(date, k -> ImmutableMap.builder()); builderForDate.put(FxRateId.of(currencyPair), FxRate.of(currencyPair, value)); } } } catch (RuntimeException ex) { throw new IllegalArgumentException( Messages.format("Error processing resource as CSV file: {}", resource), ex); } }
private static List<CurveDefinition> parseSingle( CharSource resource, Map<CurveName, LoadedCurveSettings> settingsMap) { CsvFile csv = CsvFile.of(resource, true); Map<CurveName, List<CurveNode>> allNodes = new HashMap<>(); for (CsvRow row : csv.rows()) { String curveNameStr = row.getField(CURVE_NAME); String label = row.getField(CURVE_LABEL); String symbologyQuoteStr = row.getField(CURVE_SYMBOLOGY_QUOTE); String tickerQuoteStr = row.getField(CURVE_TICKER_QUOTE); String fieldQuoteStr = row.getField(CURVE_FIELD_QUOTE); String typeStr = row.getField(CURVE_TYPE); String conventionStr = row.getField(CURVE_CONVENTION); String timeStr = row.getField(CURVE_TIME); String dateStr = row.findField(CURVE_DATE).orElse(""); String minGapStr = row.findField(CURVE_MIN_GAP).orElse(""); String clashActionStr = row.findField(CURVE_CLASH_ACTION).orElse(""); String spreadStr = row.findField(CURVE_SPREAD).orElse(""); CurveName curveName = CurveName.of(curveNameStr); StandardId quoteStandardId = StandardId.of(symbologyQuoteStr, tickerQuoteStr); FieldName quoteField = fieldQuoteStr.isEmpty() ? FieldName.MARKET_VALUE : FieldName.of(fieldQuoteStr); QuoteId quoteId = QuoteId.of(quoteStandardId, quoteField); double spread = spreadStr.isEmpty() ? 0d : Double.parseDouble(spreadStr); CurveNodeDate date = parseDate(dateStr); CurveNodeDateOrder order = parseDateOrder(minGapStr, clashActionStr); List<CurveNode> curveNodes = allNodes.computeIfAbsent(curveName, k -> new ArrayList<>()); curveNodes.add(createCurveNode(typeStr, conventionStr, timeStr, label, quoteId, spread, date, order)); } return buildCurveDefinition(settingsMap, allNodes); }
static Map<CurveName, LoadedCurveSettings> parseCurveSettings(CharSource settingsResource) { ImmutableMap.Builder<CurveName, LoadedCurveSettings> builder = ImmutableMap.builder(); CsvFile csv = CsvFile.of(settingsResource, true); for (CsvRow row : csv.rows()) { String curveNameStr = row.getField(SETTINGS_CURVE_NAME); String valueTypeStr = row.getField(SETTINGS_VALUE_TYPE); String dayCountStr = row.getField(SETTINGS_DAY_COUNT); String interpolatorStr = row.getField(SETTINGS_INTERPOLATOR); String leftExtrapolatorStr = row.getField(SETTINGS_LEFT_EXTRAPOLATOR); String rightExtrapolatorStr = row.getField(SETTINGS_RIGHT_EXTRAPOLATOR); if (!VALUE_TYPE_MAP.containsKey(valueTypeStr.toLowerCase(Locale.ENGLISH))) { throw new IllegalArgumentException( Messages.format("Unsupported {} in curve settings: {}", SETTINGS_VALUE_TYPE, valueTypeStr)); } CurveName curveName = CurveName.of(curveNameStr); ValueType yValueType = VALUE_TYPE_MAP.get(valueTypeStr.toLowerCase(Locale.ENGLISH)); CurveInterpolator interpolator = CurveInterpolator.of(interpolatorStr); CurveExtrapolator leftExtrap = CurveExtrapolator.of(leftExtrapolatorStr); CurveExtrapolator rightExtrap = CurveExtrapolator.of(rightExtrapolatorStr); boolean isPriceIndex = yValueType.equals(ValueType.PRICE_INDEX); ValueType xValueType = isPriceIndex ? ValueType.MONTHS : ValueType.YEAR_FRACTION; DayCount dayCount = isPriceIndex ? ONE_ONE : LoaderUtils.parseDayCount(dayCountStr); LoadedCurveSettings settings = LoadedCurveSettings.of(curveName, xValueType, yValueType, dayCount, interpolator, leftExtrap, rightExtrap); builder.put(curveName, settings); } return builder.build(); }
public void test_of_duplicate_headers() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV5), true); assertEquals(csvFile.headers(), ImmutableList.of("a", "b", "c", "b", "c")); assertEquals(csvFile.containsHeader("Foo"), false); assertEquals(csvFile.containsHeader("a"), true); assertEquals(csvFile.row(0).getField("a"), "aa"); assertEquals(csvFile.row(0).getField("b"), "b1"); assertEquals(csvFile.row(0).getField("c"), "c1"); assertEquals(csvFile.row(0).subRow(1, 3).getField("b"), "b1"); assertEquals(csvFile.row(0).subRow(1, 3).getField("c"), "c1"); assertEquals(csvFile.row(0).subRow(3).getField("b"), "b2"); assertEquals(csvFile.row(0).subRow(3).getField("c"), "c2"); }
public void test_of_short_data_row() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV6), true); assertEquals(csvFile.headers(), ImmutableList.of("a", "b", "c")); assertEquals(csvFile.row(0).getField("a"), "r11"); assertEquals(csvFile.row(0).getField("b"), ""); assertEquals(csvFile.row(0).getField("c"), ""); assertEquals(csvFile.row(0).field(0), "r11"); assertEquals(csvFile.row(0).field(1), ""); assertEquals(csvFile.row(0).field(2), ""); assertThrows(() -> csvFile.row(0).field(4), IndexOutOfBoundsException.class); assertEquals(csvFile.row(1).getField("a"), "r21"); assertEquals(csvFile.row(1).getField("b"), "r22"); assertEquals(csvFile.row(1).getField("c"), ""); }
public void test_of_simple_no_header_access_by_field() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), false); assertEquals(csvFile.row(0).findField("h1"), Optional.empty()); assertThrowsIllegalArg(() -> csvFile.row(0).getField("h1")); }
public void test_of_simple_with_header_access_by_invalid_field() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), true); assertEquals(csvFile.row(0).findField("h3"), Optional.empty()); assertThrowsIllegalArg(() -> csvFile.row(0).getField("h3")); }