2013-03-09 3 views
0

Я не могу найти правильное решение этой проблемы:Java Сканер Csv useDelimiter

У меня есть файл в формате CSV, который имеет список значений с разделителями-separeted отдельно для последнего. Когда я пытаюсь присвоить эти значения переменным, последнее значение первой строки учитывает первое значение второй строки. Я пробовал с помощью «, \ n *», но это не работает.

Заранее вам за помощь.

Код:

Scanner inputStream = new Scanner(file).useDelimiter(",\\n*"); 

Csv Файл:

Thomson,Alfred,NY,00192838,USA

Vincent,Ramblè,PA,0033928283,FRANCE

Что я получаю:

variable5 = USA Vincent

То, что я хотел бы получить:

variable5 = USA

variable6 = Vincent

+0

Некоторые текстовые редакторы используют \ n \ r для новых строк. – Sednus

ответ

1

Просто используйте BufferedReader, чтобы читать файл по строкам, а затем внутри основного цикла используйте StringTokenizer, чтобы токенизировать одну строку, взятую методом ReadLineBeaderReader.

0

пожалуйста, удалите *. следующий код, кажется, работает

String testpat = "abc,de\n\nasdfs,fffs,\nslsll\nss"; 
    Scanner scanner = new Scanner(testpat).useDelimiter(",\\n"); 

известить об шаблонную \ п не \ п *

+0

. Я пробовал это раньше, к сожалению, это не работает. Я получаю эту ошибку: _'Exception в потоке «main» java.lang.OutOfMemoryError: Java heap пространство'_. Затем я попытался изменить увеличение размера кучи как из файла eclipse.ini, так и из меню IDE, но я все равно получаю ту же ошибку. – JackTheDog

0

В вашей модели, вы либо хотите запятую или конец строки комбо. Лучше всего было бы не захватить группу с чередованием. Класс символов может работать, если вам никогда не приходилось учитывать комбинации CRLF, но это не всегда хорошее предположение.

Вот пример. Я использую Clojure для управления Java API, вы должны иметь возможность получить суть, если вы займетесь минуткой, чтобы посмотреть на нее, даже если вы не знакомы с Clojure. Биты после полуколоней - это комментарии.

; define a function that will return a scanner on user input 
; with a given pattern 
user=> (defn scanner [input delimiter] 
      (-> (java.util.Scanner. input) (.useDelimiter delimiter))) 
#'user/scanner 

; define the input 
user=> (def input "Thomson,Alfred,NY,00192838,USA\nVincent,Ramblè,PA,0033928283,FRANCE") 
#'user/input 

; create the scanner 
;  (:?) is a non capturing group 
;  the | in the middle tells the group to look for a or b 
;  first alternative is a comma 
;  second alternative is a newline followed by 0 or 1 
;  carriage returns. 
;  The javadoc for the java.util.Pattern class really helps 
user=> (def myscanner (scanner input "(:?,|\n\r?)")) 
#'user/myscanner 

; quick/dirty way to call next on the scanner 10 times and print 
; the result of each call 
user=> (dotimes [n 10] (println (.next myscanner))) 
Thomson 
Alfred 
NY 
00192838 
USA 
Vincent 
Ramblè 
PA 
0033928283 
FRANCE 

Если вы действительно хотите сделать CSV, эта проблема была решена много раз. Там много библиотек, которые будут обрабатывать некоторые из странных частей CSV. например http://commons.apache.org/proper/commons-csv (это просто и пример одного - вы должны оценить его перед использованием).

Удачи вам!

+0

Спасибо, Билл! Мне удалось решить проблему, просто добавив |. Таким образом, рабочий веер - «Сканер inputStream = новый сканер (файл) .useDelimiter («, | \ n »);' Спасибо всем за вашу помощь! – JackTheDog

+0

@JackTheDog Рад, что вы его нашли. Способ работы этого сайта заключается в том, что вы принимаете ответ, который является наиболее правильным для вас, а также поддерживайте другие, которые хороши. Добро пожаловать в Stack Overflow, это отличный сайт. Очень приятно помогать другим людям. – Bill

Смежные вопросы