0

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

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

提前感谢您的帮助。

代码:

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

CSV 文件:

汤姆森,阿尔弗雷德,纽约,00192838,美国

文森特,朗布尔,PA,0033928283,法国

我得到什么:

变量 5 = 美国文森特

我想得到什么:

变量 5 = 美国

变量 6 = 文森特

4

3 回答 3

1

只需使用 BufferedReader 逐行读取文件,然后在主循环内使用 StringTokenizer 对 BufferedReader readLine 方法获取的单行进行标记。

于 2013-03-09T18:54:55.727 回答
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(这只是一个例子——你应该在使用前评估它)。

祝你好运!

于 2013-03-09T20:08:51.887 回答
0

请删除 *. 以下代码似乎有效

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

注意模式 \n 不是 \n*

于 2013-03-09T18:57:48.460 回答