Skip to content

Commit 97b2355

Browse files
committed
[FIX] multi character value separator
1 parent 9f42bac commit 97b2355

File tree

6 files changed

+56
-7
lines changed

6 files changed

+56
-7
lines changed

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
# https://www.jetbrains.com/intellij-repository/snapshots
44

55
name='CSV Plugin'
6-
javaVersion=8
7-
javaTargetVersion=8
6+
javaVersion=9
7+
javaTargetVersion=9

src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
public class CsvLexerFactory {
1010
protected static CsvLexerFactory INSTANCE = new CsvLexerFactory();
1111

12-
public static final CsvLexerFactory getInstance() {
12+
public static CsvLexerFactory getInstance() {
1313
return INSTANCE;
1414
}
1515

src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSharpLexer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,18 @@ public CsvSharpLexer(Configuration configuration) {
106106
if (configuration.escapeCharacter.equals(configuration.quoteCharacter)) {
107107
tokenizer.add(TokenType.END_QUOTE, String.format("%s(?!%s)", configuration.quoteCharacter, configuration.quoteCharacter));
108108
tokenizer.add(TokenType.ESCAPED_CHARACTER, String.format("(%s%s|%s|%s)+", configuration.quoteCharacter, configuration.quoteCharacter, configuration.valueSeparator, configuration.recordSeparator));
109-
tokenizer.add(TokenType.TEXT, String.format("[^ \f%s%s%s]+",configuration.quoteCharacter, configuration.valueSeparator, configuration.recordSeparator));
109+
tokenizer.add(TokenType.TEXT, String.format("((?!%s)[^ \f%s%s])+", configuration.valueSeparator, configuration.quoteCharacter, configuration.recordSeparator));
110110
} else {
111111
tokenizer.add(TokenType.END_QUOTE, String.format("%s", configuration.quoteCharacter));
112112
tokenizer.add(TokenType.ESCAPED_CHARACTER, String.format("(%s%s|%s%s|%s|%s)+", configuration.escapeCharacter, configuration.quoteCharacter, configuration.escapeCharacter, configuration.escapeCharacter, configuration.valueSeparator, configuration.recordSeparator));
113-
tokenizer.add(TokenType.TEXT, String.format("[^ \f%s%s%s%s]+", configuration.escapeCharacter, configuration.quoteCharacter, configuration.valueSeparator, configuration.recordSeparator));
113+
tokenizer.add(TokenType.TEXT, String.format("((?!%s)[^ \f%s%s%s])+", configuration.valueSeparator, configuration.escapeCharacter, configuration.quoteCharacter, configuration.recordSeparator));
114114
}
115115

116116
unquotedNextStateTokens = LexerState.Unquoted.getPossibleTokens().stream()
117-
.map(tokenType -> tokenizer.getToken(tokenType))
117+
.map(tokenizer::getToken)
118118
.collect(Collectors.toList());
119119
quotedNextStateTokens = LexerState.Quoted.getPossibleTokens().stream()
120-
.map(tokenType -> tokenizer.getToken(tokenType))
120+
.map(tokenizer::getToken)
121121
.collect(Collectors.toList());
122122
}
123123

src/test/java/net/seesharpsoft/intellij/plugins/csv/parser/CsvParsingTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ public void testParsingTestDataWithCustomParser() {
2222
CsvEditorSettings.getInstance().setDefaultValueSeparator(CsvEditorSettings.VALUE_SEPARATOR_DEFAULT);
2323
}
2424

25+
public void testCustomMultiSymbolSeparator() {
26+
CsvEditorSettings.getInstance().setDefaultValueSeparator(CsvValueSeparator.create("~§"));
27+
doTest(true);
28+
CsvEditorSettings.getInstance().setDefaultValueSeparator(CsvEditorSettings.VALUE_SEPARATOR_DEFAULT);
29+
}
30+
2531
@Override
2632
protected String getTestDataPath() {
2733
return "./src/test/resources/parser";
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
header ~1~§header §2~§ header ,3
2+
"value ~1"~§"value §2"~§" value ~§3"
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
CSV File(0,69)
2+
CsvRecordImpl(RECORD)(0,32)
3+
CsvFieldImpl(FIELD)(0,9)
4+
PsiElement(CsvTokenType.TEXT)('header')(0,6)
5+
PsiWhiteSpace(' ')(6,7)
6+
PsiElement(CsvTokenType.TEXT)('~1')(7,9)
7+
PsiElement(CsvTokenType.COMMA)('~§')(9,11)
8+
CsvFieldImpl(FIELD)(11,20)
9+
PsiElement(CsvTokenType.TEXT)('header')(11,17)
10+
PsiWhiteSpace(' ')(17,18)
11+
PsiElement(CsvTokenType.TEXT)('§2')(18,20)
12+
PsiElement(CsvTokenType.COMMA)('~§')(20,22)
13+
PsiWhiteSpace(' ')(22,23)
14+
CsvFieldImpl(FIELD)(23,32)
15+
PsiElement(CsvTokenType.TEXT)('header')(23,29)
16+
PsiWhiteSpace(' ')(29,30)
17+
PsiElement(CsvTokenType.TEXT)(',3')(30,32)
18+
PsiElement(CsvTokenType.CRLF)('\n')(32,33)
19+
CsvRecordImpl(RECORD)(33,69)
20+
CsvFieldImpl(FIELD)(33,43)
21+
PsiElement(CsvTokenType.QUOTE)('"')(33,34)
22+
PsiElement(CsvTokenType.TEXT)('value')(34,39)
23+
PsiWhiteSpace(' ')(39,40)
24+
PsiElement(CsvTokenType.TEXT)('~1')(40,42)
25+
PsiElement(CsvTokenType.QUOTE)('"')(42,43)
26+
PsiElement(CsvTokenType.COMMA)('~§')(43,45)
27+
CsvFieldImpl(FIELD)(45,55)
28+
PsiElement(CsvTokenType.QUOTE)('"')(45,46)
29+
PsiElement(CsvTokenType.TEXT)('value')(46,51)
30+
PsiWhiteSpace(' ')(51,52)
31+
PsiElement(CsvTokenType.TEXT)('§2')(52,54)
32+
PsiElement(CsvTokenType.QUOTE)('"')(54,55)
33+
PsiElement(CsvTokenType.COMMA)('~§')(55,57)
34+
CsvFieldImpl(FIELD)(57,69)
35+
PsiElement(CsvTokenType.QUOTE)('"')(57,58)
36+
PsiWhiteSpace(' ')(58,59)
37+
PsiElement(CsvTokenType.TEXT)('value')(59,64)
38+
PsiWhiteSpace(' ')(64,65)
39+
PsiElement(CsvTokenType.ESCAPED_TEXT)('~§')(65,67)
40+
PsiElement(CsvTokenType.TEXT)('3')(67,68)
41+
PsiElement(CsvTokenType.QUOTE)('"')(68,69)

0 commit comments

Comments
 (0)