使用扫描仪读取 CSV()

2022-08-31 22:37:31

我的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

我是否错误地使用了扫描仪?


答案 1

请停止编写错误的 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. 甚至可以在未引用的值内具有引号字符;这个是无法逃脱的

如果您认为这显然不是问题,请再想一想。我看到这些项目中的每一个都错误地实现了。即使在主要的软件包中也是如此。(例如办公套件、CRM系统)

有一些很好的、正确的开箱即用的CSV阅读器和作家:

如果您坚持编写自己的内容,请至少阅读CSV的(非常短的)RFC。


答案 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|