8.2.2.1 从文件获取数据

原文链接: https://kotlinlang.org/docs/data-analysis-work-with-data-sources.html

8.2.2.1 从文件获取数据

Kotlin DataFrame 库让你可以同时处理非结构化和结构化数据。对于数据转换,你可以使用 .add()、.split()、.convert() 和 .parse() 等方法。此外,这套工具还能从各种结构化文件格式中获取和操作数据,包括 CSV、JSON、XLS、Parquet 和 Apache Arrow。所有受支持的格式请参阅 DataFrame 文档。

在本指南中,你将通过多个示例学习如何获取、精炼和处理数据。

开始之前

注意: 从 IntelliJ IDEA 2026.2 开始,Kotlin Notebook 将不再随 IDE 一起提供,也不再由 JetBrains 官方支持。源代码仍可在 GitHub 上获取。更多信息请参阅博客文章。

要学习本教程:

  1. 选择 File | New | Kotlin Notebook。
  2. 导入 Kotlin DataFrame:
1
   %use dataframe

请在任何其他代码单元之前先运行包含 %use dataframe 这一行的代码单元,以确保 DataFrame 库及其 API 在笔记本中可用。

要学习本教程,你也可以把 DataFrame 用作 Gradle 或 Maven 依赖。

获取数据

要从文件中获取数据,请使用 DataFrame.read() 函数:

1
val movies = DataFrame.read("movies.csv")

DataFrame.read() 函数会根据文件扩展名和内容检测输入格式。

你还可以传入额外参数来控制 DataFrame 库读取输入数据的方式。例如,以下代码为 CSV 文件指定了自定义分隔符(;):

1
val movies = DataFrame.read("movies.csv", delimiter = ';')

提示: 关于其他文件格式和各种读取函数的全面概述,请参阅 Kotlin DataFrame 库文档。

显示数据

拿到数据之后,你就可以显示它。最简单的方式是把数据存入变量然后返回它:

1
2
val jsonDf = DataFrame.read("jsonFile.json")
jsonDf

这段代码会把文件中的数据显示为可交互的表格:

显示数据

你可以借助这个视图检查取值、查看列名,并轻松了解数据集的状态。

检查数据结构

要深入了解数据的结构或模式,请在你的 DataFrame 变量上使用 .schema() 函数。

例如,运行 jsonDf.schema() 可以列出 JSON 数据集中每一列的类型:

模式示例

你也可以使用自动补全功能。它让你可以快速访问和操作 DataFrame 的属性。加载数据后,只需输入 DataFrame 变量后跟一个点号(.),就能看到可用列及其类型的列表。

可用属性

精炼数据

Kotlin DataFrame 提供了各种操作来精炼数据集。例如分组、过滤、更新或添加新列。这些函数对数据分析至关重要,让你能够有效地组织、清理和转换数据。

例如,我们来看 movies.csv 数据集。它把电影标题和上映年份存储在同一个单元格中。目标是精炼这个数据集,以便更容易分析:

  1. 加载数据

使用 .read() 函数把文件加载到 DataFrame 中:

1
   val movies = DataFrame.read("movies.csv")
  1. 添加一列

要从 title 列中提取上映年份,请添加一个新的 year 列:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
   val moviesWithYear = movies
       .add("year") {
           "\\d{4}".toRegex()
               .findAll(title)
               .lastOrNull()
               ?.value
               ?.toInt()
               ?: -1
       }

   moviesWithYear
  1. 更新值

要从电影标题中移除上映年份,请更新 title 列:

1
2
3
4
5
6
   val moviesTitle = moviesWithYear
       .update("title") {
           "\\s*\\(\\d{4}\\)\\s*$".toRegex().replace(title, "")
   }

   moviesTitle

这段代码把电影标题保留在一列中,并把上映年份移到另一列中。

  1. 过滤行

要只关注特定数据,请使用 .filter() 函数。例如,只保留 1986 年之后上映的电影,请运行:

1
2
3
4
5
   val newMovies = moviesTitle.filter {
       year >= 1996
   }

   newMovies
  1. 移除列

要移除不需要的列,请使用 .remove() 函数:

1
2
3
4
5
   val refinedMovies = newMovies.remove {
       movieID
   }

   refinedMovies

作为对比,下面是精炼之前的数据集:

原始数据集

下面是精炼之后的数据集:

数据精炼结果

提示: 关于更多使用场景和详细示例,请参阅 Kotlin Dataframe 示例。

导出数据

精炼数据之后,你可以轻松地导出它。

你可以为此使用各种 .write() 函数。它支持保存为多种格式,包括 CSV、JSON、XLS、XLSX、Apache Arrow,甚至 HTML 表格。所有受支持的格式请参阅 DataFrame 文档。这对于分享你的发现、创建报告,或让数据可供进一步分析特别有用。

例如,我们把结果保存为:

1
  refinedMovies.writeJson("movies.json")
1
  refinedMovies.writeCsv("movies.csv")
1
2
  refinedMovies.writeArrowIPC("movies.arrow")
  refinedMovies.writeArrowFeather("movies.feather")

你也可以使用 .toStandaloneHTML() 函数在浏览器中打开独立的 HTML 表格:

1
2
3
refinedMoviesDf
    .toStandaloneHTML(DisplayConfiguration(rowsLimit = null))
    .openInBrowser()

接下来做什么