我无法找到解决此问题的正确方法:
我有一个.csv文件,其中包含最后一个逗号分隔的值列表。 当我尝试将这些值分配给变量时,第一行的最后一个值包含第二行的第一个值。我试过“,\ n *”,但它不起作用。
先谢谢你的帮助。
代码:
Scanner inputStream = new Scanner(file).useDelimiter(",\\n*");
Csv文件:
汤姆森,阿尔弗雷德,NY,00192838,USA
文森特,漫游,PA,0033928283,法国
我得到了什么:
variable5 =美国文森特
我想得到什么:
variable5 = USA
variable6 = Vincent
答案 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(这只是一个例子 - 您应该在使用前对其进行评估)。
祝你好运!