miller 处理csv文件

166 阅读3分钟

miller介绍

Miller(通常简称为 mlr)是一个强大的文本处理工具,它结合了命令行工具如 awksedcutjoinsortuniq 的功能,用于处理和分析 CSV、TSV、JSON 等格式的文本数据。Miller 可以被视为一种数据流处理器,特别适合处理结构化的数据文件。

以下是 Miller 6.12.0 的一些核心功能:

核心功能

  1. 数据格式支持

    • 支持不同的输入和输出格式,包括 CSV、TSV、JSON、JSON Lines、DKVP(Delimiter-separated Key-Value Pairs)。
  2. 强大的过滤和转换功能

    • 强大的过滤和选择功能,可以根据列值或条件进行过滤。
    • 支持丰富的表达式和函数,进行数据转换和计算。
  3. 记录操作

    • 支持对记录的添加、删除、修改操作。
    • 支持记录的排序、分组、统计等操作。
  4. 数据聚合

    • 支持根据特定列进行数据聚合,如求和、平均、最小值、最大值等。
    • 支持窗口函数、分组统计等复杂的聚合操作。
  5. 多文件处理

    • 支持多个文件的联合处理,可以进行文件的合并、连接等操作。
  6. 高效的性能

    • 设计高效的内存和CPU使用,适合处理大规模数据文件。
  7. 集成和兼容性

    • 可以很容易地与其他命令行工具和脚本结合使用。
    • 提供跨平台支持,可以在不同的操作系统上运行。

示例用法

以下是一些常见的使用示例:

  • 查看 CSV 文件内容:

    mlr --icsv --opprint cat sample.csv
    
  • 过滤记录:

    mlr --icsv --opprint filter '$age > 30' sample.csv
    
  • 选择特定列:

    mlr --icsv --opprint cut -f name,age sample.csv
    
  • 进行聚合计算:

    mlr --icsv --opprint stats1 -a min,mean,max -f age -g gender sample.csv
    

获取和安装

你可以从其 GitHub 仓库 获取最新版本的 Miller。安装方式包括:

  • 使用 Homebrew(适用于 macOS 和 Linux):

    brew install miller
    
  • 从源码编译安装:

    git clone https://github.com/johnkerl/miller.git
    cd miller
    make
    sudo make install
    

Miller 是一个非常灵活和强大的工具,特别适合需要在命令行界面对结构化文本数据进行复杂处理和分析的用户。

miller处理合并文件

Miller (mlr) 是一个非常强大的文本处理工具,它可以很方便地处理多个文件。以下是一些关于如何使用 Miller 进行多文件处理的示例和说明:

多文件处理的一些方式

  1. 按顺序处理多个文件: 你可以通过在命令行中列出多个文件名,Miller 会按顺序处理这些文件。

    mlr --icsv --opprint cat file1.csv file2.csv
    

    上述命令会按顺序读取 file1.csvfile2.csv 的内容并输出。

  2. 合并多个文件的数据: 如果你希望将多个文件的数据合并处理,可以使用 join 功能,依据某些共同的字段来连接文件中的记录。

    mlr --icsv join --ul -j id -f file1.csv file2.csv
    

    这将基于 id 字段将 file1.csvfile2.csv 的记录进行连接。

  3. 分组处理多个文件的数据: 你可以将多个文件的数据合并后进行分组统计或其他操作。

    mlr --icsv --opprint merge --id id file1.csv file2.csv | mlr --csv stats1 -a sum,mean -f value -g id
    

    这将把 file1.csvfile2.csv 中的记录基于 id 合并,并进行分组统计,计算 value 字段的总和和平均值。

  4. 串联处理多个文件的数据: 你可以像处理单个文件一样处理多个文件的数据,然后将结果输出到一个文件或其他命令进行进一步处理。

    mlr --csv put '$total=$quantity*$price' file1.csv file2.csv > combined_output.csv
    

    这将在 file1.csvfile2.csv 的数据中计算 total 字段,并将结果输出到 combined_output.csv

示例用法

示例 1:简单的文件合并

假设有两个 CSV 文件 file1.csvfile2.csv

file1.csv:

id,name,age
1,John,23
2,Jane,29

file2.csv:

id,name,age
3,Mike,26
4,Sara,22

你可以将它们合并并打印输出:

mlr --csv cat file1.csv file2.csv

结果:

id,name,age
1,John,23
2,Jane,29
3,Mike,26
4,Sara,22

示例 2:按字段连接文件

假设有两个 CSV 文件 orders.csvcustomers.csv

orders.csv:

order_id,customer_id,amount
1,101,50
2,102,75
3,101,200

customers.csv:

customer_id,customer_name
101,John Doe
102,Jane Smith

你可以基于 customer_id 字段将两个文件连接起来:

mlr --csv join -j customer_id -f orders.csv customers.csv

结果:

customer_id,order_id,amount,customer_name
101,1,50,John Doe
102,2,75,Jane Smith
101,3,200,John Doe

示例 3:合并并聚合多个文件的数据

假设有两个 CSV 文件 sales_jan.csvsales_feb.csv

sales_jan.csv:

product,quantity
apple,50
banana,30

sales_feb.csv:

product,quantity
apple,40
banana,25

你可以将它们合并并计算总销量:

mlr --csv concatenate sales_jan.csv sales_feb.csv | mlr --csv stats1 -a sum -f quantity -g product

结果:

product,sum_quantity
apple,90
banana,55

这些示例显示了 Miller 如何高效地处理多个文件,并进行各种复杂的数据操作。希望这些示例能帮助你理解如何使用 Miller 处理多文件数据。