You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取CSV中URL触发URISyntaxException报错,求解决方法

解决CSV文件中URL读取的URISyntaxException问题

问题场景

你有一个包含URL和Label的CSV测试样本,内容如下:

| https://www.google.com | 0 |
| --- | --- |
| http://atualizacaodedados.online | 1 |

使用Java代码读取时触发了URISyntaxException,错误信息如下:

Exception in thread "main" java.net.URISyntaxException: Illegal character in scheme name at index 0: https://www.google.com
    at java.base/java.net.URI$Parser.fail(URI.java:2966)
    at java.base/java.net.URI$Parser.checkChars(URI.java:3137)
    at java.base/java.net.URI$Parser.checkChar(URI.java:3147)
    at java.base/java.net.URI$Parser.parse(URI.java:3162)
    at java.base/java.net.URI.<init>(URI.java:623)
    at feturesExtraction2.datasetFile.main(datasetFile.java:22)

错误原因

  1. 分隔符设置错误:你的CSV实际用**竖线(|)**分隔字段,但代码中设置了逗号作为分隔符,导致读取的内容包含多余的|、换行符、表头的---等非法字符,这些字符会导致URI构造失败。
  2. 读取逻辑不严谨:没有跳过表头行,且循环嵌套会重复填充数组,导致逻辑混乱。

解决方案

方案1:手动处理每行(无需第三方库)

先逐行读取文件,跳过表头,再分割每行的字段,清理字段前后的空格和竖线,最后构造URI:

import java.io.BufferedReader;
import java.io.FileReader;
import java.net.URI;

public class DatasetReader {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("urltest.csv"))) {
            String line;
            // 跳过表头行(前两行:第一行是表头,第二行是分隔线)
            reader.readLine();
            reader.readLine();
            
            URI[] uris = new URI[2];
            int index = 0;
            while ((line = reader.readLine()) != null && index < 2) {
                // 分割字段,清理前后的|和空格
                String[] parts = line.split("\\|");
                if (parts.length >= 2) {
                    String url = parts[1].trim(); // 获取URL字段,清理空格
                    uris[index] = new URI(url);
                    System.out.println(uris[index]);
                    index++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方案2:使用Apache Commons CSV库(适合大型数据集)

对于大型CSV文件,使用专业的CSV解析库更可靠,避免手动处理的各种边缘情况:

  1. 先添加Maven依赖(如果用Maven):
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.10.0</version>
</dependency>
  1. 读取代码示例:
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.net.URI;

public class DatasetReader {
    public static void main(String[] args) {
        try (CSVParser parser = CSVFormat.DEFAULT
                .withDelimiter('|')
                .withTrim() // 自动清理字段前后空格
                .withSkipHeaderRecord() // 跳过表头行
                .parse(new FileReader("urltest.csv"))) {
            
            URI[] uris = new URI[2];
            int index = 0;
            for (CSVRecord record : parser) {
                if (index >= 2) break;
                String url = record.get(1); // 第二个字段是URL(索引从0开始)
                uris[index] = new URI(url);
                System.out.println(uris[index]);
                index++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项

  • 如果你的CSV实际是标准逗号分隔(可能是你用表格展示的格式问题),只需要把分隔符改成,即可。
  • 处理大型数据集时,优先使用专业CSV库,避免手动处理的错误和性能问题。

内容的提问来源于stack exchange,提问作者Jomanah OB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:35:38