private static CsvFile create(List<String> lines, boolean headerRow, char separator) { if (headerRow) { for (int i = 0; i < lines.size(); i++) { ImmutableList<String> headers = parseLine(lines.get(i), i + 1, separator); if (!headers.isEmpty()) { ImmutableMap<String, Integer> searchHeaders = buildSearchHeaders(headers); return parseAll(lines, i + 1, separator, headers, searchHeaders); } } throw new IllegalArgumentException("Could not read header row from empty CSV file"); } return parseAll(lines, 0, separator, ImmutableList.of(), ImmutableMap.of()); }
/** * Obtains an instance from a list of headers and rows. * <p> * The headers may be an empty list. * All the rows must contain a list of the same size, matching the header if present. * * @param headers the headers, empty if no headers * @param rows the data rows * @return the CSV file * @throws IllegalArgumentException if the rows do not match the headers */ public static CsvFile of(List<String> headers, List<? extends List<String>> rows) { ArgChecker.notNull(headers, "headers"); ArgChecker.notNull(rows, "rows"); int size = (headers.size() == 0 && rows.size() > 0 ? rows.get(0).size() : headers.size()); if (rows.stream().filter(row -> row.size() != size).findAny().isPresent()) { throw new IllegalArgumentException("Invalid data rows, each row must have same columns as header row"); } ImmutableList<String> copiedHeaders = ImmutableList.copyOf(headers); ImmutableMap<String, Integer> searchHeaders = buildSearchHeaders(copiedHeaders); ImmutableList.Builder<CsvRow> csvRows = ImmutableList.builder(); int firstLine = copiedHeaders.isEmpty() ? 1 : 2; for (int i = 0; i < rows.size(); i++) { csvRows.add(new CsvRow(copiedHeaders, searchHeaders, i + firstLine, ImmutableList.copyOf(rows.get(i)))); } return new CsvFile(copiedHeaders, searchHeaders, csvRows.build()); }
ImmutableList<String> headers = CsvFile.parseLine(line, lineNumber, separator); if (!headers.isEmpty()) { return new CsvIterator(breader, separator, headers, CsvFile.buildSearchHeaders(headers), lineNumber);