This is an automated email from the ASF dual-hosted git repository. fschumacher pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jmeter.git
commit b22b00c69459dad4f7b02518c6a5e1f4bcfebad4 Author: Felix Schumacher <felix.schumac...@internetallee.de> AuthorDate: Sat Jul 9 14:14:09 2022 +0200 Guess the delimiter of the CSV source, when configured one seems wrong. This is in line with the behaviour of CSVSaveService. Bugzilla Id: 66140 --- .../jmeter/report/core/SampleMetaDataParser.java | 38 ++++++++++++++++++++-- xdocs/changes.xml | 2 ++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/core/src/main/java/org/apache/jmeter/report/core/SampleMetaDataParser.java b/src/core/src/main/java/org/apache/jmeter/report/core/SampleMetaDataParser.java index aeab11b89c..bc96a660d5 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/core/SampleMetaDataParser.java +++ b/src/core/src/main/java/org/apache/jmeter/report/core/SampleMetaDataParser.java @@ -17,6 +17,10 @@ package org.apache.jmeter.report.core; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -26,14 +30,42 @@ import java.util.regex.Pattern; */ public class SampleMetaDataParser { - private char separator; + private final char separator; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private static final Pattern DELIMITER_PATTERN = Pattern + // This assumes the header names are all single words with no spaces + // word followed by 0 or more repeats of (non-word char + word) + // where the non-word char (\2) is the same + // e.g. abc|def|ghi but not abd|def~ghi + .compile("\\w+((\\W)\\w+)?(\\2\\w+)*(\\2\"\\w+\")*" // $NON-NLS-1$ + // last entries may be quoted strings + ); public SampleMetaDataParser(char separator) { this.separator = separator; } public SampleMetadata parse(String headRow) { - String[] cols = headRow.split(Pattern.quote(Character.toString(separator))); - return new SampleMetadata(separator, cols); + char useSep = separator; + if (headRow.indexOf(useSep) < 0) { + Matcher matcher = DELIMITER_PATTERN.matcher(headRow); + if (matcher.matches()) { + String guessedSep = matcher.group(2); + if (guessedSep.length() != 1) { + throw new IllegalArgumentException( + "We guessed a delimiter of '"+guessedSep+"', but we support only one-character-separators"); + } + useSep = guessedSep.charAt(0); + logger.warn("Use guessed delimiter '{}' instead of configured '{}'. " + +"Please configure the property 'jmeter.save.saveservice.default_delimiter={}'", + useSep, + separator, + useSep); + } + } + String[] cols = headRow.split(Pattern.quote(Character.toString(useSep))); + return new SampleMetadata(useSep, cols); } } diff --git a/xdocs/changes.xml b/xdocs/changes.xml index 65147fb68d..89aa8ddc62 100644 --- a/xdocs/changes.xml +++ b/xdocs/changes.xml @@ -137,6 +137,8 @@ Summary <h3>Report / Dashboard</h3> <ul> + <li><bug>66140</bug>Guess the delimiter of the CSV source, when configured one seems wrong. + This is in line with the behaviour of CSVSaveService.</li> </ul> <h3>Documentation</h3>