Разделение на запятую вне пары двойных кавычек.Игнорировать двойные кавычки, если он одинарный - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть два типа строк, которые мне нужно разделить, используя запятую

Первый тип (1 "означает 1 дюйм)

130,TEXT 1" 67 SERIES ,400,4,1,998,.010,9,-,7,130

Второй тип

130,"TEXT, SAMPLE TEXT",400,4,1,998,.010,9,-,7,130

В первом типе мне нужно взять строку как есть и разделить, используя, поэтому мои значения разделения будут 130 и TEXT 1 "67 SERIES и т. Д.

Но во втором типе мне нужно игнорировать запятую междудвойные кавычки и взять строку целиком.

Я разделил, используя это

a.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")

, которое прошло второй случай, но не удалось в первом.Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ваш входной формат не является допустимым форматом CSV.Согласно странице Википедии Значения, разделенные запятыми , если цитирование вообще используется, буквальный символ кавычки в поле должен заключаться в кавычки.

Это означает, что этомаловероятно, что любая существующая библиотека синтаксического анализатора CSV общего назначения справится с обоими типами строк в одном файле.

Чтобы проиллюстрировать, насколько глубока эта проблема, рассмотрим:

   130,TEXT 1" 67 SERIES, TEXT 2",4,1,998,.010,9,-,7,130

Это может означать:

  • одно поле, содержащее TEXT 1" 67 SERIES, TEXT 2"
  • одно поле, содержащее TEXT 1 67 SERIES, TEXT 2, или
  • , два поля TEXT 1" 67 SERIES и TEXT 2".

Единственный способ устранить неоднозначность - это написать некую пользовательскую логику для ее сортировки.... на основе ваших собственных бизнес-правил.

Я не думаю, что вы можете сделать это с помощью split и регулярных выражений.Вам нужно написать правильный пользовательский синтаксический анализатор.

Но в этом случае, я думаю, у вас будет право отодвинуть того, кто / что бы ни создавал эти данные CSV.Они должны следовать правилам.Я хотел бы реализовать свою систему для подачи файлов CSV через стандартную проверку синтаксиса и автоматического отклонения любых файлов, которые не проходят проверку.

Можете ли вы исправить ошибки в цитировании автоматически?Я думаю, что нет ... в общем случае.Как уже отмечалось, невозможно определить, является ли двойная кавычка в искаженном CSV буквальной или нет.Требуется человеческий интеллект и знание предметной области, чтобы понять, что означают данные.

0 голосов
/ 12 февраля 2019

Не знаю, как (если вообще) это можно сделать с помощью одного регулярного выражения.Но вот метод грубой силы, который подсчитывает количество кавычек в строке и идет оттуда.

public static void main(String[] args) {
    System.out.println("---Type 1---");
    for (String s : split("130,TEXT 1\" 67 SERIES ,400,4,1,998,.010,9,-,7,130")) {
        System.out.println(s);
    }
    System.out.println("\n---Type 2---");
    for (String s : split("130,\"TEXT, SAMPLE TEXT\",400,4,1,998,.010,9,-,7,130")) {
        System.out.println(s);
    }
}

private static List<String> split(String str) {
    List<String> tokens = new ArrayList<>();
    if (str.split("\"").length > 2) {
        int firstQuoteIndex = str.indexOf("\"");
        int secondQuoteIndex = str.indexOf("\"", firstQuoteIndex + 1);
        tokens.add(str.substring(0, firstQuoteIndex - 1));
        tokens.add(str.substring(firstQuoteIndex + 1, secondQuoteIndex));
        tokens.addAll(Arrays.asList(str.substring(secondQuoteIndex + 2).split(",")));
    } else {
        tokens.addAll(Arrays.asList(str.split(",")));
    }
    return tokens;
}

Выход

---Type 1---
130
TEXT 1" 67 SERIES 
400
4
1
998
.010
9
-
7
130

---Type 2---
130
TEXT, SAMPLE TEXT
400
4
1
998
.010
9
-
7
130
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...