This is an automated email from the ASF dual-hosted git repository.
delei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fesod.git
The following commit(s) were added to refs/heads/main by this push:
new bae0c663 feat: add support for column-based reading of CSV files (#982)
bae0c663 is described below
commit bae0c6638158470f2589a73557a4190a13f5cc4f
Author: Selim S. <[email protected]>
AuthorDate: Thu Aug 6 18:23:17 2026 +0100
feat: add support for column-based reading of CSV files (#982)
* feature: csv column filtering support
* addressing first wave of reviews
* addressing first wave of reviews 2
* addressing second wave of reviews
* fix test method call
* fix test method call and test behaviour
* fix test method call and test behaviour
* fix test method call and test behaviour + define the includeColumnIndexes
in CSVReaderBuilder
---------
Co-authored-by: Selim Soufargi <[email protected]~>
---
.../sheet/analysis/csv/CsvExcelReadExecutor.java | 22 +++++++++++++++---
.../fesod/sheet/read/builder/CsvReaderBuilder.java | 11 +++++++++
.../org/apache/fesod/sheet/FesodSheetTest.java | 26 ++++++++++++++++++++++
3 files changed, 56 insertions(+), 3 deletions(-)
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 b2741a3f..833aba53 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,13 +223,28 @@ public class CsvExcelReadExecutor implements
ExcelReadExecutor {
csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoTrim();
Boolean autoStrip =
csvReadContext.csvReadWorkbookHolder().globalConfiguration().getAutoStrip();
+ List<Integer> includeColumnIndexes =
+
csvReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
while (cellIterator.hasNext()) {
String cellString = cellIterator.next();
+ int currentColumnIndex = columnIndex++;
+ int targetColumnIndex;
+
+ if (includeColumnIndexes == null) {
+ targetColumnIndex = currentColumnIndex;
+ } else {
+ targetColumnIndex =
includeColumnIndexes.indexOf(currentColumnIndex);
+ if (targetColumnIndex < 0) {
+ continue;
+ }
+ }
+
ReadCellData<String> readCellData = new ReadCellData<>();
readCellData.setRowIndex(rowIndex);
- readCellData.setColumnIndex(columnIndex);
- // csv is an empty string of whether <code>,,</code> is read or
<code>,"",</code>
+ readCellData.setColumnIndex(targetColumnIndex);
+
if (StringUtils.isNotBlank(cellString)) {
readCellData.setType(CellDataTypeEnum.STRING);
if (autoStrip) {
@@ -242,7 +257,8 @@ public class CsvExcelReadExecutor implements
ExcelReadExecutor {
} else {
readCellData.setType(CellDataTypeEnum.EMPTY);
}
- cellMap.put(columnIndex++, readCellData);
+
+ cellMap.put(targetColumnIndex, readCellData);
}
RowTypeEnum rowType = MapUtils.isEmpty(cellMap) ? RowTypeEnum.EMPTY :
RowTypeEnum.DATA;
diff --git
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
index 36a6befe..84b8cb8e 100644
---
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
+++
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/CsvReaderBuilder.java
@@ -117,6 +117,17 @@ public class CsvReaderBuilder extends
AbstractExcelReaderParameterBuilder<CsvRea
return this;
}
+ /**
+ * Specific columns to read
+ *
+ * @param columnIndexes
+ * @return
+ */
+ public CsvReaderBuilder includeColumnIndexes(List<Integer> columnIndexes) {
+ readSheet.setColumnIndexes(columnIndexes);
+ return this;
+ }
+
/**
* Sets the escape character.
*
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 b086c585..8f267eb7 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,11 +23,13 @@ import java.io.File;
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.ArrayList;
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;
@@ -253,6 +255,30 @@ class FesodSheetTest {
Assertions.assertNotNull(builder);
}
+ @Test
+ void testReadCsv_withColumnIndexes_shouldFilterColumns() throws Exception {
+
+ String csvContent = "ID,Name,Age,Gender\n2,Bob,25,Male";
+ File csvFile = tempDir.resolve("test_columns.csv").toFile();
+ FileUtils.writeStringToFile(csvFile, csvContent,
StandardCharsets.UTF_8);
+
+ List<Integer> targetColumns = Arrays.asList(0, 2);
+
+ List<Map<Integer, String>> readResults = FesodSheet.read(csvFile)
+ .csv()
+ .includeColumnIndexes(targetColumns)
+ .doReadSync();
+
+ Assertions.assertNotNull(readResults);
+ Assertions.assertEquals(1, readResults.size());
+
+ Map<Integer, String> row1 = readResults.get(0);
+ Assertions.assertEquals(
+ 2, row1.size(), "Should only contain the 1 filtered columns
(excepting the head by default)");
+ Assertions.assertEquals("2", row1.get(0));
+ Assertions.assertEquals("25", row1.get(1));
+ }
+
@Test
void testReadSheet_withColumnIndexes_shouldConfigureAll() {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]