java 扫描仪和分析CSV文件

h5qlskok  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(145)

我有一个简单的CSV文件的格式如下。

Company,Name,12,13,18
Company,Name,12,13,18
Company,Name,12,13,18
Company,Name,12,13,18
Company,Name,12,13,18

我正在尝试解析所有令牌,并尝试使用next()nextInt()。下面的代码在每一行的最后一个标记上抛出一个异常(在这个示例中,值为18,最后一个nextInt调用)。例外是InputMismatchException
我很难理解为什么它是不匹配的-我已经检查过CSV没有任何奇怪的地方,比如空格。
代码如下。

public void readFile(String Path) {

    try {
        Scanner sc = new Scanner(Paths.get(Path)).useDelimiter(",");
        while (sc.hasNextLine()) {
     
            while (sc.hasNext()) {
                System.out.println(sc.next());
                System.out.println(sc.next());
                System.out.println(sc.nextInt());
                System.out.println(sc.nextInt());
                System.out.println(sc.nextInt());
            }
        
            sc.close();
        }
    } catch(IOException e) {
        System.out.println("Cannot find file: " + Path);
    }
}

第一个while循环将查看每一行,第二个while循环将查看由逗号分隔的每个标记,我的理解是否正确?

xoshrz7s

xoshrz7s1#

把我的评论和@deHaar说的结合起来:

public static List<CompanyInfo> readFile(String path) throws IOException {
    return Files.lines(Path.of(path)).
        map(CompanyInfo::fromCsv).
        collect(Collectors.toList());
}
5uzkadbs

5uzkadbs2#

对于Java中的CSV阅读,我直接建议使用外部库,因为这项工作在开始时相当困难。
Apache Commons CSV就是一个很好的工具。此外,我有自己的文件io的东西库。这里是Github repo。我仍然渴望改进它,所以我完全开放的任何意见。

5cg8jx4n

5cg8jx4n3#

您正在使用java.nioPath),这意味着您也可以使用该包中的其他类。要读取文件中的行,可以使用File.readAllLines(),它返回List<String>,其中每一项代表一行。有了这个列表,你就可以开始在循环或流中分割行了。
下面是一个例子:

CSV示例

Company One,Supercompany,12,9,18
Company Two,Ultracompany,13,10,19
Company Three,Megacompany,14,11,20
Company Four,Godlike Company,15,12,21
Company Five,Best Company,16,13,22

Java代码

public static void main(String[] args) {
    // path to your file (ATTENTION: dummy path, might not exist on your system)
    Path pathToCsvFile = Paths.get("/some/absolute/path/to/companies.csv");

    try {
        // read all the lines
        Files.readAllLines(pathToCsvFile).forEach(line -> {
            // split the content of each line by comma
            String[] lineParts = line.split(",");
            // and join the parts to a new String using a different delimiter
            System.out.println(String.join(" -- ", lineParts));
        });
    } catch (IOException e1) {
        // handle errors (this is just a dummy output, might not be sufficient!)
        throw new RuntimeException(
                    "Reading " + pathToCsvFile.toAbsolutePath().toString() 
                    + " did not work, Reason: " + e1.getMessage()
        );
    }

输出

Company One -- Supercompany -- 12 -- 9 -- 18
Company Two -- Ultracompany -- 13 -- 10 -- 19
Company Three -- Megacompany -- 14 -- 11 -- 20
Company Four -- Godlike Company -- 15 -- 12 -- 21
Company Five -- Best Company -- 16 -- 13 -- 22

相关问题