小编典典

Java 使用Scanner()读取CSV

java

我的csv正在读入System.out,但是我注意到任何带空格的文本都移到下一行(作为返回\ n)

这是我的csv的启动方式:

first,last,email,address 1, address 2
john,smith,blah@blah.com,123 St. Street,
Jane,Smith,blech@blech.com,4455 Roger Cir,apt 2

运行我的应用程序后,任何带有空格(地址1)的单元格都将扔到下一行。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class main {

    public static void main(String[] args) {
        // -define .csv file in app
        String fileNameDefined = "uploadedcsv/employees.csv";
        // -File class needed to turn stringName to actual file
        File file = new File(fileNameDefined);

        try{
            // -read from filePooped with Scanner class
            Scanner inputStream = new Scanner(file);
            // hashNext() loops line-by-line
            while(inputStream.hasNext()){
                //read single line, put in string
                String data = inputStream.next();
                System.out.println(data + "***");

            }
            // after loop, close scanner
            inputStream.close();


        }catch (FileNotFoundException e){

            e.printStackTrace();
        }

    }
}

因此,这是控制台中的结果:

first,last,email,address 
1,address 
2
john,smith,blah@blah.com,123 
St. 
Street,
Jane,Smith,blech@blech.com,4455 
Roger 
Cir,apt 
2

我使用扫描仪的方式有误吗?


阅读 926

收藏
2020-03-09

共2个答案

小编典典

scanner.useDelimiter(",");

这应该工作。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class TestScanner {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("/Users/pankaj/abc.csv"));
        scanner.useDelimiter(",");
        while(scanner.hasNext()){
            System.out.print(scanner.next()+"|");
        }
        scanner.close();
    }

}

对于CSV文件:

a,b,c d,e
1,2,3 4,5
X,Y,Z A,B

输出为:

a|b|c d|e
1|2|3 4|5
X|Y|Z A|B|
2020-03-09
小编典典

请停止编写错误的CSV解析器!

我见过数百个CSV解析器,因此在线上也有所谓的教程。

几乎每个人都弄错了!

这不会是一件坏事,因为它没有影响到我,但人们谁尝试写CSV 读者,并把它错倾向于写CSV 作家了。并弄错他们。这些我必须为其编写解析器。

请记住,CSV(顺序不是那么明显):

  1. 值周围可以带引号
  2. 可以使用除“
  3. 甚至可以使用除“和”之外的其他引号字符
  4. 完全没有引号
  5. 甚至可以在某些值上使用引号字符,而在其他值上没有引号
  6. 可以有除和以外的其他分隔符;
  7. 分隔符和(引用的)值之间可以有空格
  8. 可以有除ASCII以外的其他字符集
  9. 每行应具有相同数量的值,但并不总是
  10. 可以包含带引号”foo”,”“,”bar”或不引号的空字段:”foo”,,”bar”
  11. 可以在值中包含换行符
  12. 不能包含换行的值,如果他们不分隔
  13. 值之间不能包含换行符
  14. 如果正确转义,可以在值内包含定界字符
  15. 不使用反斜杠转义分隔符,但…
  16. 使用引号字符本身对其进行转义,例如Frodo’s Ring将’Frodo’‘s Ring’
  17. 可以在值的开头或结尾使用引号,甚至可以只包含字符(”foo”“”, “”“bar”, “”“”)
  18. 甚至可以在未加引号的值内包含加引号的字符;这一个没有逃脱

如果你认为这显然不是问题,请再考虑一下。我已经看到这些项目中的每一项都被错误地实施。即使在主要软件包中。(例如Office-Suite,CRM系统)

2020-03-09