This is an automated email from the ASF dual-hosted git repository.

tilman pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new 08ebe87ab TIKA-4278: refactor delimiters as a set to include semicolon 
pipe and colon, code cleanup
08ebe87ab is described below

commit 08ebe87ab0330362d5d01d8ad809fc5fb6e2d99e
Author: Tilman Hausherr <[email protected]>
AuthorDate: Mon Jul 15 05:44:33 2024 +0200

    TIKA-4278: refactor delimiters as a set to include semicolon pipe and 
colon, code cleanup
---
 .../tika-parser-text-module/pom.xml                |  5 +++
 .../org/apache/tika/parser/csv/CSVSniffer.java     |  8 ++---
 .../apache/tika/parser/csv/TextAndCSVParser.java   | 20 ++++-------
 .../org/apache/tika/parser/csv/CSVSnifferTest.java | 42 +++++++++++++++-------
 4 files changed, 45 insertions(+), 30 deletions(-)

diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/pom.xml
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/pom.xml
index f0df94415..6621b0486 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/pom.xml
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/pom.xml
@@ -42,6 +42,11 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-csv</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/CSVSniffer.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/CSVSniffer.java
index 52c7f79ce..53c9e4cb5 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/CSVSniffer.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/CSVSniffer.java
@@ -27,6 +27,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.io.input.ProxyReader;
 
@@ -42,15 +43,15 @@ class CSVSniffer {
     private static final int PUSH_BACK = 2;
     private static final int SPACE = ' ';
 
-    private final char[] delimiters;
+    private final Set<Character> delimiters;
     private final int markLimit;
     private final double minConfidence;
 
-    CSVSniffer(char[] delimiters) {
+    CSVSniffer(Set<Character> delimiters) {
         this(DEFAULT_MARK_LIMIT, delimiters, DEFAULT_MIN_CONFIDENCE);
     }
 
-    CSVSniffer(int markLimit, char[] delimiters, double minConfidence) {
+    CSVSniffer(int markLimit, Set<Character> delimiters, double minConfidence) 
{
         this.markLimit = markLimit;
         this.delimiters = delimiters;
         this.minConfidence = minConfidence;
@@ -310,7 +311,6 @@ class CSVSniffer {
                 throw new EOFException();
             }
             unread(reader, c);
-            return;
         }
 
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java
index 462167d14..b98bc4a45 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java
@@ -95,8 +95,6 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
     private static final String TABLE = "table";
     private static final int DEFAULT_MARK_LIMIT = 20000;
 
-    private static final char[] DEFAULT_DELIMITERS = new char[]{',', '\t'};
-
     private static final Map<Character, String> CHAR_TO_STRING_DELIMITER_MAP = 
new HashMap<>();
     private static final Map<String, Character> STRING_TO_CHAR_DELIMITER_MAP = 
new HashMap<>();
     private static final Set<MediaType> SUPPORTED_TYPES = Collections
@@ -116,8 +114,6 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
         }
     }
 
-    private char[] delimiters = DEFAULT_DELIMITERS;
-
     /**
      * This is the mark limit in characters (not bytes) to
      * read from the stream when classifying the stream as
@@ -135,7 +131,6 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
     private double minConfidence = 0.50;
 
     public TextAndCSVParser() {
-        super();
     }
 
     public TextAndCSVParser(EncodingDetector encodingDetector) {
@@ -159,10 +154,7 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
         if (mediaType == null) {
             return false;
         }
-        if (mediaType.getBaseType().equals(TSV) || 
mediaType.getBaseType().equals(CSV)) {
-            return true;
-        }
-        return false;
+        return mediaType.getBaseType().equals(TSV) || 
mediaType.getBaseType().equals(CSV);
     }
 
     @Override
@@ -175,8 +167,8 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
                       ParseContext context) throws IOException, SAXException, 
TikaException {
 
         CSVParams params = getOverride(metadata);
-        Reader reader = null;
-        Charset charset = null;
+        Reader reader;
+        Charset charset;
         if (!params.isComplete()) {
             reader = detect(params, stream, metadata, context);
             if (params.getCharset() != null) {
@@ -294,7 +286,7 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
                         getEncodingDetector(context));
             }
         }
-        Reader reader = null;
+        Reader reader;
         if (params.getCharset() == null) {
             reader = new AutoDetectReader(CloseShieldInputStream.wrap(stream), 
metadata,
                     getEncodingDetector(context));
@@ -310,7 +302,7 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
         if (params.getDelimiter() == null &&
                 (params.getMediaType() == null || 
isCSVOrTSV(params.getMediaType()))) {
 
-            CSVSniffer sniffer = new CSVSniffer(markLimit, delimiters, 
minConfidence);
+            CSVSniffer sniffer = new CSVSniffer(markLimit, 
CHAR_TO_STRING_DELIMITER_MAP.keySet(), minConfidence);
             CSVResult result = sniffer.getBest(reader, metadata);
             params.setMediaType(result.getMediaType());
             params.setDelimiter(result.getDelimiter());
@@ -376,7 +368,7 @@ public class TextAndCSVParser extends 
AbstractEncodingDetectorParser {
             // deprecated, see TIKA-431
             metadata.set(Metadata.CONTENT_ENCODING, 
params.getCharset().name());
         }
-        if (!mediaType.equals(MediaType.TEXT_PLAIN) && params.getDelimiter() 
!= null) {
+        if (!MediaType.TEXT_PLAIN.equals(mediaType) && params.getDelimiter() 
!= null) {
             if 
(CHAR_TO_STRING_DELIMITER_MAP.containsKey(params.getDelimiter())) {
                 attrs.put(DELIMITER, 
CHAR_TO_STRING_DELIMITER_MAP.get(params.getDelimiter()));
             } else {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/csv/CSVSnifferTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/csv/CSVSnifferTest.java
index 338593901..9e9e2c024 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/csv/CSVSnifferTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/csv/CSVSnifferTest.java
@@ -27,7 +27,9 @@ import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
+import com.google.common.collect.ImmutableSet;
 import org.junit.jupiter.api.Test;
 
 import org.apache.tika.TikaTest;
@@ -35,30 +37,38 @@ import org.apache.tika.mime.MediaType;
 
 public class CSVSnifferTest extends TikaTest {
 
-    private static char[] DELIMITERS = new char[]{',', '\t'};
+    private static final Set<Character> DELIMITERS = ImmutableSet.of(',', ';', 
'\t', '|');
 
-    private static byte[] CSV_BASIC =
+    private static final byte[] CSV_BASIC =
             ("the,quick,brown\tfox\n" + "jumped \tover,the\tlazy,\tdog\n" +
                     "and 
then,ran,down\tthe\tstreet").getBytes(StandardCharsets.UTF_8);
 
-    private static byte[] TSV_BASIC =
+    private static final byte[] CSV_BASIC2 =
+            ("the;quick;brown\tfox\n" + "jumped \tover;the\tlazy;\tdog\n" +
+                    "and 
then;ran;down\tthe\tstreet").getBytes(StandardCharsets.UTF_8);
+
+    private static final byte[] CSV_BASIC3 =
+            ("the|quick|brown\tfox\n" + "jumped \tover|the\tlazy|\tdog\n" +
+                    "and 
then|ran|down\tthe\tstreet").getBytes(StandardCharsets.UTF_8);
+
+    private static final byte[] TSV_BASIC =
             ("the\tquick\tbrown,fox\n" + "jumped ,over\tthe,lazy\t,dog\n" +
                     "and 
then\tran\tdown,the,street").getBytes(StandardCharsets.UTF_8);
 
-    private static byte[] CSV_MID_CELL_QUOTE_EXCEPTION =
+    private static final byte[] CSV_MID_CELL_QUOTE_EXCEPTION =
             ("the,quick,brown\"fox\n" + "jumped over,the lazy,dog\n" +
                     "and then,ran,down the 
street").getBytes(StandardCharsets.UTF_8);
 
 
-    private static byte[] ALLOW_SPACES_BEFORE_QUOTE =
+    private static final byte[] ALLOW_SPACES_BEFORE_QUOTE =
             ("the,quick,         \"brown\"\"fox\"\n" + "jumped over,the 
lazy,dog\n" +
                     "and then,ran,down the 
street").getBytes(StandardCharsets.UTF_8);
 
-    private static byte[] ALLOW_SPACES_AFTER_QUOTE =
+    private static final byte[] ALLOW_SPACES_AFTER_QUOTE =
             ("the,\"quick\"     ,brown  fox\n" + "jumped over,the lazy,dog\n" +
                     "and then,ran,down the 
street").getBytes(StandardCharsets.UTF_8);
 
-    private static List<CSVResult> sniff(char[] delimiters, byte[] bytes, 
Charset charset)
+    private static List<CSVResult> sniff(Set<Character> delimiters, byte[] 
bytes, Charset charset)
             throws IOException {
         CSVSniffer sniffer = new CSVSniffer(delimiters);
         try (BufferedReader reader = new BufferedReader(
@@ -70,11 +80,19 @@ public class CSVSnifferTest extends TikaTest {
     @Test
     public void testCSVBasic() throws Exception {
         List<CSVResult> results = sniff(DELIMITERS, CSV_BASIC, 
StandardCharsets.UTF_8);
-        assertEquals(2, results.size());
+        assertEquals(4, results.size());
         assertEquals(Character.valueOf(','), results.get(0).getDelimiter());
 
+        results = sniff(DELIMITERS, CSV_BASIC2, StandardCharsets.UTF_8);
+        assertEquals(4, results.size());
+        assertEquals(Character.valueOf(';'), results.get(0).getDelimiter());
+
+        results = sniff(DELIMITERS, CSV_BASIC3, StandardCharsets.UTF_8);
+        assertEquals(4, results.size());
+        assertEquals(Character.valueOf('|'), results.get(0).getDelimiter());
+
         results = sniff(DELIMITERS, TSV_BASIC, StandardCharsets.UTF_8);
-        assertEquals(2, results.size());
+        assertEquals(4, results.size());
         assertEquals(Character.valueOf('\t'), results.get(0).getDelimiter());
     }
 
@@ -83,18 +101,18 @@ public class CSVSnifferTest extends TikaTest {
         List<CSVResult> results =
                 sniff(DELIMITERS, CSV_MID_CELL_QUOTE_EXCEPTION, 
StandardCharsets.UTF_8);
 
-        assertEquals(2, results.size());
+        assertEquals(4, results.size());
     }
 
     @Test
     public void testAllowWhiteSpacesAroundAQuote() throws Exception {
         List<CSVResult> results =
                 sniff(DELIMITERS, ALLOW_SPACES_BEFORE_QUOTE, 
StandardCharsets.UTF_8);
-        assertEquals(2, results.size());
+        assertEquals(4, results.size());
         assertEquals(Character.valueOf(','), results.get(0).getDelimiter());
 
         results = sniff(DELIMITERS, ALLOW_SPACES_AFTER_QUOTE, 
StandardCharsets.UTF_8);
-        assertEquals(2, results.size());
+        assertEquals(4, results.size());
         assertEquals(Character.valueOf(','), results.get(0).getDelimiter());
     }
 

Reply via email to