Java Scanner Csv useDelimiter

时间:2013-03-09 18:48:31

标签: java csv

我无法找到解决此问题的正确方法:

我有一个.csv文件,其中包含最后一个逗号分隔的值列表。 当我尝试将这些值分配给变量时,第一行的最后一个值包含第二行的第一个值。我试过“,\ n *”,但它不起作用。

先谢谢你的帮助。

代码:

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

Csv文件:

  

汤姆森,阿尔弗雷德,NY,00192838,USA

     

文森特,漫游,PA,0033928283,法国

我得到了什么:

  

variable5 =美国文森特

我想得到什么:

  

variable5 = USA

     

variable6 = Vincent

3 个答案:

答案 0 :(得分:1)

只需使用BufferedReader逐行读取文件,然后在主循环内部使用StringTokenizer来标记BufferedReader readLine方法所占用的一行。

答案 1 :(得分:0)

请删除*。以下代码似乎可以正常工作

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

注意模式\ n不是\ n *

答案 2 :(得分: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(这只是一个例子 - 您应该在使用前对其进行评估)。

祝你好运!