当前位置: 首页 > 知识库问答 >
问题:

在阅读CSV时,我开始时会有一个问号

史朗
2023-03-14

我试图在学校做一个关于Java文本输入/输出的小练习,在尝试读取带有名称前缀(荷兰语)和姓氏的CSV文件时,我在开始时得到了一个问号。

这是一个小练习,我需要将我的代码添加到一个已经存在的项目中,其中包含3个小文件,以练习文本I/O的使用,请参阅项目代码:https://github.com/Remzi1993/klantenBestand

    public void vulNamenLijst() {
    // TODO: Lees het bestand "resources/NamenlijstGroot.csv" en zet elke regel (<tussenvoegsel>,<achternaam>)
    // in de ArrayList namenLijst.

    file = new File("resources/NamenlijstGroot.csv");

    try (
            Scanner scanner = new Scanner(file);
    ) {
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            String[] values = line.split(",");
            String namePrefix = values[0];
            String surname = values[1];
            namenLijst.add(namePrefix + " " + surname);
        }
    } catch (FileNotFoundException e) {
        System.err.println("Data file doesn't exist!");
    } catch (Exception e) {
        System.err.println("Something went wrong");
        e.printStackTrace();
    }
}

很抱歉在代码中同时使用荷兰语和英语。我试着用英语编写自己的代码,但这个代码练习已经存在,我只需要添加一些带有//TODO的代码来练习文本I/O。

共有3个答案

辛星宇
2023-03-14

为了使用“标准”组件减轻BOM,可以使用Apache的BOMInputStream。请注意,BOM有多种风格(请参阅此处了解更多详细信息),这应该能够可靠地处理它们。

如果你有一个相当大的项目,你可能会发现你的项目中已经通过commons io有了BOMInputStream

扫描仪将接收输入流(见此处)

饶曦之
2023-03-14

我找到了一个简单的解决方案

final String UTF8_BOM = "\uFEFF";

if (line.startsWith(UTF8_BOM)) {
    line = line.substring(1);
}

一个简单可行的例子:

File file = new File("resources/NamenlijstGroot.csv");

try (
    Scanner scanner = new Scanner(file, StandardCharsets.UTF_8);
) {
    while (scanner.hasNext()) {
        String line = scanner.nextLine().strip();

        final String UTF8_BOM = "\uFEFF";

        if (line.startsWith(UTF8_BOM)) {
            line = line.substring(1);
        }

        String[] values = line.split(",");
        String namePrefix = values[0];
        String surname = values[1];
        namenLijst.add(namePrefix + " " + surname);
    }
} catch (FileNotFoundException e) {
    System.err.println("Data file doesn't exist!");
} catch (Exception e) {
    System.err.println("Something went wrong");
    e.printStackTrace();
}
督瑞
2023-03-14

@funky是正确的。您的文件以UTF8-BOM开头。

xxd的输出:

00000000: efbb bf64 652c 4a6f 6e67 0a2c 4a61 6e73  ...de,Jong.,Jans
00000010: 656e 0a64 652c 5672 6965 730a 7661 6e20  en.de,Vries.van 

前三个字节是:ef bb bf

 类似资料:
  • 我正在尝试实现一个使用可观察的发出更改的类。当对此可观察对象完成订阅时,我想发送一个启动/初始化事件。然后我想发送通常的事件。 例如假设我有两个不同的订户A和B。A和B在不同的时间开始订阅。如果是MyClass。getChanges()发出事件1、2、3、4和5。 如果A在事件1、2之间启动it订阅,则应接收以下事件:InitialEvent、2、3、4、5。 如果B在事件4和5之间启动it订阅,

  • 我想从话题的一开始就开始消费。我已经将属性“AUTO\u OFFSET\u RESET\u CONFIG”设置为最早,但不知何故它仍然没有从一开始就读取。 如果我错过了什么,有什么想法吗?我每次都在创造一个新的消费群体。

  • 我想从我的android应用程序中读取来自Google Sheets的表格。我想通过Google Sheets API来做到这一点。我将工作表声明为公共,创建了API密钥并尝试发送服务调用: 我有401密码。答复: 请求缺少必需的身份验证凭据。需要OAuth 2访问令牌、登录cookie或其他有效的身份验证凭据。看见https://developers.google.com/identity/si

  • 我想用Java读取一个巨大的文件。它包括75,000,000条线路。问题是,即使我使用的是最大和限制,但我得到的是:`java.lang.OutOfMemoryError(GC开销限制已超过),它显示这一行导致错误: 我做了一些测试,看到我能很好地阅读15,000,000行。因此我开始使用这种代码: 这里,它很好地写出了第一个15,000,000行,但是在第二个试验中,这再次给出了相同的错误,尽管

  • 我正在尝试使用OpenCSV从一个CSV文件中读取。然后我想从输入csv中复制所有数据并将其输出到另一个csv文件,同时添加一个包含信息的新列。 我正在尝试的另一种方法是这样的(改变while循环,所有其他代码保持不变): 这确实正确地打印了所有的行,但是它只是复制。我想添加额外的“JSON”列及其数据。