/** * 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; }
private static SecurityTrade parseSecurityTrade(CsvRow row, TradeInfo info, TradeCsvInfoResolver resolver) { String securityIdScheme = row.findValue(SECURITY_ID_SCHEME_FIELD).orElse(DEFAULT_SECURITY_SCHEME); String securityIdValue = row.getValue(SECURITY_ID_FIELD); SecurityId securityId = SecurityId.of(securityIdScheme, securityIdValue); double price = LoaderUtils.parseDouble(row.getValue(PRICE_FIELD)); double quantity = parseTradeQuantity(row); return SecurityTrade.of(info, securityId, quantity, price); }
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); }
/** * 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. * Matching is case insensitive. * * @param header the column header * @return the trimmed field value * @throws IllegalArgumentException if the header is not found */ public String getField(String header) { Integer index = findIndex(header); if (index == null) { throw new IllegalArgumentException("Header not found: '" + header + "'"); } return field(index); }
private TradeInfo parseTradeInfo(CsvRow row) { TradeInfoBuilder infoBuilder = TradeInfo.builder(); String scheme = row.findField(ID_SCHEME_FIELD).orElse(DEFAULT_TRADE_SCHEME); row.findValue(ID_FIELD).ifPresent(id -> infoBuilder.id(StandardId.of(scheme, id))); String schemeCpty = row.findValue(CPTY_SCHEME_FIELD).orElse(DEFAULT_CPTY_SCHEME); row.findValue(CPTY_FIELD).ifPresent(cpty -> infoBuilder.counterparty(StandardId.of(schemeCpty, cpty))); row.findValue(TRADE_DATE_FIELD).ifPresent(dateStr -> infoBuilder.tradeDate(LoaderUtils.parseDate(dateStr))); row.findValue(TRADE_TIME_FIELD).ifPresent(timeStr -> infoBuilder.tradeTime(LoaderUtils.parseTime(timeStr))); row.findValue(TRADE_ZONE_FIELD).ifPresent(zoneStr -> infoBuilder.zone(ZoneId.of(zoneStr))); row.findValue(SETTLEMENT_DATE_FIELD).ifPresent(dateStr -> infoBuilder.settlementDate(LoaderUtils.parseDate(dateStr))); resolver.parseTradeInfo(row, infoBuilder); return infoBuilder.build(); }
assertEquals(headers.get(1), "h2"); assertEquals(csvFile.rowCount(), 3); assertEquals(csvFile.row(0).lineNumber(), 2); assertEquals(csvFile.row(1).lineNumber(), 3); assertEquals(csvFile.row(2).lineNumber(), 4); assertEquals(csvFile.row(0).headers(), headers); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "r11"); assertEquals(csvFile.row(0).field(1), "r12"); assertEquals(csvFile.row(1).headers(), headers); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r21"); assertEquals(csvFile.row(1).field(1), "r22"); assertEquals(csvFile.row(0).getField("h1"), "r11"); assertEquals(csvFile.row(0).getField("h2"), "r12"); assertEquals(csvFile.row(1).getField("h1"), "r21"); assertEquals(csvFile.row(1).getField("h2"), "r22"); assertThrowsIllegalArg(() -> csvFile.row(0).getField("zzz")); assertEquals(csvFile.row(0).getValue("h1"), "r11"); assertEquals(csvFile.row(0).getValue("h2"), "r12"); assertEquals(csvFile.row(1).getValue("h1"), "r21"); assertEquals(csvFile.row(1).getValue("h2"), "r22"); assertThrowsIllegalArg(() -> csvFile.row(0).getValue("zzz")); assertThrowsIllegalArg(() -> csvFile.row(2).getValue("h2")); assertEquals(csvFile.row(0).findField("h1"), Optional.of("r11"));
public void test_of_simple_no_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), false); assertEquals(csvFile.headers().size(), 0); assertEquals(csvFile.rowCount(), 4); assertEquals(csvFile.containsHeader("Foo"), false); assertEquals(csvFile.containsHeader(Pattern.compile("Foo")), false); assertEquals(csvFile.row(0).lineNumber(), 1); assertEquals(csvFile.row(1).lineNumber(), 2); assertEquals(csvFile.row(2).lineNumber(), 3); assertEquals(csvFile.row(3).lineNumber(), 4); assertEquals(csvFile.row(0).headers().size(), 0); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "h1"); assertEquals(csvFile.row(0).field(1), "h2"); assertEquals(csvFile.row(1).headers().size(), 0); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r11"); assertEquals(csvFile.row(1).field(1), "r12"); assertEquals(csvFile.row(2).headers().size(), 0); assertEquals(csvFile.row(2).fieldCount(), 2); assertEquals(csvFile.row(2).field(0), "r21"); assertEquals(csvFile.row(2).field(1), "r22"); assertEquals(csvFile.row(0).subRow(0).fieldCount(), 2); assertEquals(csvFile.row(0).subRow(1).fieldCount(), 1); assertEquals(csvFile.row(0).subRow(2).fieldCount(), 0); }
for (CsvRow batchRow : batchRows) { try { CurveName reference = CurveName.of(batchRow.getValue(REFERENCE_HEADER)); CurveName resolvedCurveName = resolver.checkCurveName(reference); CurveSensitivitiesType type = CurveSensitivitiesType.of(batchRow.getValue(TYPE_HEADER)); ParameterMetadata metadata = parseMetadata(batchRow, false); Currency currency = parseCurrency(batchRow, reference); String valueStr = batchRow.getField(VALUE_HEADER); if (!valueStr.isEmpty()) { double value = LoaderUtils.parseDouble(valueStr); PARSING, "CSV file could not be parsed at line {}: {}", batchRow.lineNumber(), ex.getMessage()));
public void test_of_blank_row() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV3), false); assertEquals(csvFile.rowCount(), 2); assertEquals(csvFile.row(0).lineNumber(), 1); assertEquals(csvFile.row(1).lineNumber(), 3); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "r11"); assertEquals(csvFile.row(0).field(1), "r12"); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r21"); assertEquals(csvFile.row(1).field(1), "r22"); }
/** * Parses the contract specification from the row. * * @param row the CSV row to parse * @param type the ETD type * @return the contract specification * @throws IllegalArgumentException if the specification is not found */ public default EtdContractSpec parseEtdContractSpec(CsvRow row, EtdType type) { ExchangeId exchangeId = ExchangeId.of(row.getValue(EXCHANGE_FIELD)); EtdContractCode contractCode = EtdContractCode.of(row.getValue(CONTRACT_CODE_FIELD)); EtdContractSpecId specId = EtdIdUtils.contractSpecId(type, exchangeId, contractCode); return getReferenceData().findValue(specId).orElseThrow( () -> new IllegalArgumentException("ETD contract specification not found in reference data: " + specId)); }
private static IborIndex parseIborIndex(CsvRow row) { String name = row.getValue(NAME_FIELD); Currency currency = Currency.parse(row.getValue(CURRENCY_FIELD)); boolean active = Boolean.parseBoolean(row.getValue(ACTIVE_FIELD)); DayCount dayCount = DayCount.of(row.getValue(DAY_COUNT_FIELD)); HolidayCalendarId fixingCal = HolidayCalendarId.of(row.getValue(FIXING_CALENDAR_FIELD)); int offsetDays = Integer.parseInt(row.getValue(OFFSET_DAYS_FIELD)); HolidayCalendarId offsetCal = HolidayCalendarId.of(row.getValue(OFFSET_CALENDAR_FIELD)); HolidayCalendarId effectiveCal = HolidayCalendarId.of(row.getValue(EFFECTIVE_DATE_CALENDAR_FIELD)); Tenor tenor = Tenor.parse(row.getValue(TENOR_FIELD)); LocalTime time = LocalTime.parse(row.getValue(FIXING_TIME_FIELD), TIME_FORMAT); ZoneId zoneId = ZoneId.of(row.getValue(FIXING_ZONE_FIELD)); DayCount fixedLegDayCount = DayCount.of(row.getValue(FIXED_LEG_DAY_COUNT)); PeriodAdditionConvention.extendedEnum().find(row.getField(TENOR_CONVENTION_FIELD)) .orElse(PeriodAdditionConventions.NONE); BusinessDayConvention tenorBusinessConvention = BusinessDayConvention.extendedEnum().find(row.getField(TENOR_CONVENTION_FIELD)) .orElse(isEndOfMonth(periodAdditionConvention) ? MODIFIED_FOLLOWING : FOLLOWING); BusinessDayAdjustment adj = BusinessDayAdjustment.of(tenorBusinessConvention, effectiveCal);
try { ParameterMetadata metadata = parseMetadata(batchRow, true); CurveSensitivitiesType type = batchRow.findValue(TYPE_HEADER) .map(str -> CurveSensitivitiesType.of(str)) .orElse(CurveSensitivitiesType.ZERO_RATE_DELTA); CurveName reference = entry.getValue(); CurveName resolvedCurveName = resolver.checkCurveName(reference); String valueStr = batchRow.getField(entry.getKey()); Currency currency = parseCurrency(batchRow, reference); if (!valueStr.isEmpty()) { PARSING, "CSV file could not be parsed at line {}: {}", batchRow.lineNumber(), ex.getMessage()));
public void test_asStream_simple_no_header() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), false)) { assertEquals(csvFile.headers().size(), 0); List<CsvRow> rows = csvFile.asStream().collect(toList()); assertEquals(csvFile.hasNext(), false); assertEquals(rows.size(), 3); CsvRow row0 = rows.get(0); assertEquals(row0.headers().size(), 0); assertEquals(row0.fieldCount(), 2); assertEquals(row0.field(0), "h1"); assertEquals(row0.field(1), "h2"); CsvRow row1 = rows.get(1); assertEquals(row1.headers().size(), 0); assertEquals(row1.fieldCount(), 2); assertEquals(row1.field(0), "r11"); assertEquals(row1.field(1), "r12"); CsvRow row2 = rows.get(2); assertEquals(row2.headers().size(), 0); assertEquals(row2.fieldCount(), 2); assertEquals(row2.field(0), "r21"); assertEquals(row2.field(1), "r22"); } }
private static Optional<String> findValue(CsvRow row, String leg, String field) { return row.findValue(leg + field); }
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"), ""); }
CsvRow row = csv.next(); try { String typeRaw = row.getField(TYPE_FIELD); TradeInfo info = parseTradeInfo(row); switch (typeRaw.toUpperCase(Locale.ENGLISH)) { if (tradeType == SwapTrade.class || tradeType == Trade.class) { List<CsvRow> variableRows = new ArrayList<>(); while (csv.hasNext() && csv.peek().getField(TYPE_FIELD).toUpperCase(Locale.ENGLISH).equals("VARIABLE")) { variableRows.add(csv.next()); FailureReason.PARSING, "CSV file contained a 'Variable' type at line {lineNumber} that was not preceeded by a 'Swap'", row.lineNumber())); break; case "FX": "CSV file trade type '{tradeType}' is not known at line {lineNumber}", typeRaw, row.lineNumber())); break; ex, "CSV file trade could not be parsed at line {lineNumber}: {exceptionMessage}", row.lineNumber(), ex.getMessage()));
public void test_of_blank_row() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV3), false)) { assertEquals(csvFile.hasNext(), true); CsvRow row0 = csvFile.next(); assertEquals(row0.fieldCount(), 2); assertEquals(row0.field(0), "r11"); assertEquals(row0.field(1), "r12"); CsvRow row1 = csvFile.next(); assertEquals(row1.fieldCount(), 2); assertEquals(row1.field(0), "r21"); assertEquals(row1.field(1), "r22"); assertEquals(csvFile.hasNext(), false); } }
/** * Gets a single value from the row by header. * <p> * This returns the value of the first column where the header matches the specified header pattern. * If the value is an empty string, then an empty optional is returned. * * @param header the column header * @return the trimmed field value, empty */ public Optional<String> findValue(String header) { return findField(header).filter(str -> !str.isEmpty()); }
/** * 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. * * @param headerPattern the header pattern to match * @return the trimmed field value, empty if not found */ public Optional<String> findField(Pattern headerPattern) { for (int i = 0; i < headers.size(); i++) { if (headerPattern.matcher(headers.get(i)).matches()) { return Optional.of(field(i)); } } return Optional.empty(); }