diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java index b2741a3ff..3ae1b58d8 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/csv/CsvExcelReadExecutor.java @@ -223,11 +223,16 @@ private void dealRecord(CSVRecord record, int rowIndex) { csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoTrim(); Boolean autoStrip = csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoStrip(); + List includeColumnIndexes = csvReadContext.readSheetHolder().getColumnIndexes(); while (cellIterator.hasNext()) { String cellString = cellIterator.next(); + int currentColumnIndex = columnIndex++; + if (includeColumnIndexes != null && !includeColumnIndexes.contains(currentColumnIndex)) { + continue; + } ReadCellData readCellData = new ReadCellData<>(); readCellData.setRowIndex(rowIndex); - readCellData.setColumnIndex(columnIndex); + readCellData.setColumnIndex(currentColumnIndex); // csv is an empty string of whether ,, is read or ,"", if (StringUtils.isNotBlank(cellString)) { @@ -242,7 +247,7 @@ private void dealRecord(CSVRecord record, int rowIndex) { } else { readCellData.setType(CellDataTypeEnum.EMPTY); } - cellMap.put(columnIndex++, readCellData); + cellMap.put(currentColumnIndex, readCellData); } RowTypeEnum rowType = MapUtils.isEmpty(cellMap) ? RowTypeEnum.EMPTY : RowTypeEnum.DATA; diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 44a8bee94..a3f614d3b 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -23,7 +23,12 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.apache.commons.io.FileUtils; import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder; import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder; import org.apache.fesod.sheet.read.listener.ReadListener; @@ -247,4 +252,28 @@ void testReadSheet_withAllParams_shouldReturnBuilder() { ExcelReaderSheetBuilder builder = FesodSheet.readSheet(0, "DataSheet", 100); Assertions.assertNotNull(builder); } + + @Test + void testReadCsv_withColumnIndexes_shouldFilterColumns() throws Exception { + + String csvContent = "1,Alice,30,Female\n2,Bob,25,Male"; + File csvFile = tempDir.resolve("test_columns.csv").toFile(); + FileUtils.writeStringToFile(csvFile, csvContent, StandardCharsets.UTF_8); + + List targetColumns = Arrays.asList(0, 2); + + List> readResults = FesodSheet.read(csvFile) + .includeColumnIndexes(targetColumns) + .sheet(0) + .doReadSync(); + + Assertions.assertNotNull(readResults); + Assertions.assertEquals(2, readResults.size()); + + Map row1 = readResults.get(0); + Assertions.assertEquals(2, row1.size(), "Should only contain the 2 filtered columns"); + Assertions.assertEquals("1", row1.get(0)); + Assertions.assertEquals("30", row1.get(2)); + Assertions.assertNull(row1.get(1), "Column index 1 (Name) should be omitted"); + } }