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)
错误原因
- 分隔符设置错误:你的CSV实际用**竖线(|)**分隔字段,但代码中设置了逗号作为分隔符,导致读取的内容包含多余的
|、换行符、表头的---等非法字符,这些字符会导致URI构造失败。 - 读取逻辑不严谨:没有跳过表头行,且循环嵌套会重复填充数组,导致逻辑混乱。
解决方案
方案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解析库更可靠,避免手动处理的各种边缘情况:
- 先添加Maven依赖(如果用Maven):
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.10.0</version> </dependency>
- 读取代码示例:
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
相关产品推荐
相关产品推荐

