【问题标题】:Strange symbol at the beginning of the imported CSV file导入的 CSV 文件开头的奇怪符号
【发布时间】:2019-05-09 13:01:36
【问题描述】:

我正在将一个 CSV 文件解析到我的 JTable 中。问题是每次我的第一张唱片前面都会出现一些奇怪的符号。这是我的代码:

JFileChooser chooser=new JFileChooser();
    chooser.showOpenDialog(null);
    File f=chooser.getSelectedFile();
    String filename=f.getAbsolutePath();
    pathF.setText(filename);

    try {
        FileReader fr=new FileReader(f);
        BufferedReader br= new BufferedReader(fr);

        DefaultTableModel model=(DefaultTableModel)jTable1.getModel();
        Object [] lines=br.lines().toArray();
        for(int i=0;i<lines.length;i++){
            String []row=lines[i].toString().split(";");
            model.addRow(row);
        }

所以一切正常,但在第一条记录前面出现了奇怪的符号。这是输出:

如您所见,i10 前面有一个空方格。肯定这是某个角色,但我怎么能摆脱它,因为由于这个角色,程序假设 i10 和 (square)i10 是不同的人。我还用System.out.println(lines[i].toString()); 进行了检查,结果是:

您可以清楚地看到第一行中不需要的符号。我该如何解决?

【问题讨论】:

  • 大量输入,其中真正的问题是一个完全不同的问题,与您的 java 代码无关:该文件中有什么 ;-) 不要问为什么您的 java 代码对该文件中的一个字符。问问自己那个角色真正是什么(例如通过使用hex编辑器查看文件)并做一些研究;-)

标签: java csv parsing export-to-csv


【解决方案1】:

它被称为 BOM(字节顺序标记)。它标志着流的开始,您可以使用 Apache Commons csv 库的 BOMInputStream 将其删除。使用该库来读取和解析 csv,它更简单并且提供了很多功能。

类似这样的:

BOMInputStream bis = new BOMInputStream(file.getInputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(bis,StandardCharsets.UTF_8));

使用 apache commons 的示例:https://www.callicoder.com/java-read-write-csv-file-apache-commons-csv/

更多关于 Bom 的信息:How to exclude BOM with BOM InputStream

【讨论】:

  • 不编写自己的 CSV 解析器的另一个好理由。我在 20 年前写过一篇,我以为我已经涵盖了所有相关方面……今天我发现我当时忽略了一些东西 ;-)
  • 又一个不使用 CSV 的好理由!!!作为一种格式,它是完全非标准的,你根本不知道任何使用它的人一直在应用什么意想不到的编码技巧。 CSV“标准”是否支持 \uxxxx 表示法来表示任意 BMP 字符?如果使用的分隔符是分号,出现在数据值中的逗号字符是否也必须“转义”?事实上,在 CSV 中是否存在标准的“转义”语法?它是否支持带有覆盖字符的编码技巧,例如表示“ñ”的“〜n”?等等等等等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多