Tablesaw项目数据导入完全指南:从CSV到数据库
概述
Tablesaw作为一款高效的Java数据分析库,其数据导入功能是进行数据分析的第一步。本文将全面介绍Tablesaw支持的各种数据导入方式,包括CSV、JSON、Excel等常见格式,以及从数据库导入数据的技巧。
支持的数据格式
Tablesaw支持多种数据格式的导入和导出:
| 格式 | 导入 | 导出 | |---------------------|------|------| | CSV/分隔文本 | 支持 | 支持 | | JSON | 支持 | 支持 | | 关系数据库(JDBC) | 支持 | 不支持 | | 固定宽度文本 | 支持 | 支持 | | Excel | 支持 | 不支持 | | HTML表格 | 支持 | 支持 |
文本文件导入详解
基础CSV导入
最简单的CSV文件导入方式:
Table t = Table.read().file("myFile.csv");
此方法使用默认参数:逗号分隔、包含表头行。如需自定义参数,可使用CsvReadOptions
构建器:
CsvReadOptions.Builder builder =
CsvReadOptions.builder("myFile.csv")
.separator('\t') // 使用制表符分隔
.header(false) // 无表头
.dateFormat("yyyy.MM.dd"); // 日期格式
Table t1 = Table.read().usingOptions(builder.build());
列类型处理
Tablesaw会自动推断列类型,但有时需要手动指定:
ColumnType[] types = {LOCAL_DATE, INTEGER, FLOAT, FLOAT, CATEGORY};
Table t = Table.read().usingOptions(CsvReadOptions
.builder("myFile.csv")
.columnTypes(types));
手动指定类型有两个优势:
- 减少加载时间(跳过类型推断)
- 完全控制列类型
获取推断的列类型
对于多列文件,可以先生成类型推断结果:
String types = CsvReader.printColumnTypes("data/bush.csv", true, ','));
输出结果可直接用于代码中,包含列索引和名称注释。
跳过不需要的列
使用SKIP类型可跳过特定列:
ColumnType[] types = {SKIP, INTEGER, FLOAT, FLOAT, SKIP};
处理缺失值
Tablesaw默认将以下值视为缺失值:"NaN"、"*"、"NA"、"null"和空字符串""。可自定义缺失值标识:
.missingValueIndicator("-")
日期时间处理
处理不同地区的日期时间格式:
.locale(Locale.FRENCH)
.dateFormat("yyyy.MM.dd")
.timeFormat("HH:mm:ss")
.dateTimeFormat("yyyy.MM.dd::HH:mm:ss")
高级导入技术
流式API
使用InputStream实现更灵活的导入方式,适用于网络文件、S3等场景:
Table.read().csv(InputStream stream, String tableName);
从网站加载CSV
String location = "https://example.com/data.csv";
Table table = Table.read().usingOptions(CsvReadOptions.builder(new URL(location))
从S3加载CSV
S3Object object = s3Client.getObject(bucketName, key);
Table t = Table.read().usingOptions(CsvReadOptions.builder(object.getObjectContent()))
处理非UTF-8编码
InputStreamReader reader = new InputStreamReader(
new FileInputStream("file.csv"), Charset.forName("ISO-8859-1"));
Table data = Table.read().usingOptions(CsvReadOptions.builder(reader, "table"));
数据库导入
从数据库查询结果导入数据:
Table t = Table.read().db(ResultSet resultSet, String tableName);
完整示例:
String DB_URL = "jdbc:derby:CoffeeDB;create=true";
Connection conn = DriverManager.getConnection(DB_URL);
try (Statement stmt = conn.createStatement();
ResultSet results = stmt.executeQuery("SELECT * FROM Customer")) {
Table customer = Table.read().db(results, "Customer");
}
其他格式导入
Tablesaw还支持HTML、JSON和Excel格式导入,需添加相应依赖:
- tablesaw-html: HTML表格导入
- tablesaw-json: JSON数据导入
- tablesaw-excel: Excel文件导入
最佳实践
- 对于大型文件,预先指定列类型可显著提高加载速度
- 处理国际数据时,务必设置正确的Locale
- 从不可靠数据源导入时,先检查推断的列类型
- 考虑使用流式API处理远程或大文件数据
通过掌握这些导入技术,您可以为后续的数据分析工作奠定坚实基础。Tablesaw灵活的导入选项能够满足各种复杂场景的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考