Прямой ответ на ваш вопрос заключается в том, что невозможно узнать, если вы только что начали новую строку, когда используете Scanner::next
/ Scanner::hasNext
.И вообще, нет никакого способа узнать, каким был последний разделитель.Разделители отбрасываются.
Как говорит Дж. Б. Низет, существует множество существующих библиотек с открытым исходным кодом для чтения CSV, поэтому нет необходимости реализовывать эту функцию с использованием Scanner
.Действительно, правильная реализация CSV-чтения не тривиальна, особенно если вам нужно реализовать заголовки, кавычки, экранирование и / или строки продолжения.Рекомендуется использовать существующую библиотеку.
Но если (вопреки совету!) Вы решите внедрить программу чтения напрямую, то более надежный подход - использовать вложенный цикл:
- внешний цикл читает полные строки, используя
nextLine
- Внутренний цикл создает
Scanner
для каждой строки, чтобы разбить ее на поля.
За исключением того, что это не относится к цитированию, экранирование, строки продолжения и т. д. Настоящая проблема заключается в том, что грамматика CSV не имеет простого контекстно-независимого разделителя.
Полагаю, я мог бы использовать какой-то счетчик для подсчета [полей]
Да ... но если в некоторых строках CSV отсутствуют поля (например, из-за человеческой ошибки), то при подсчете полей это не будет обнаружено.