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

如何用Julia快速查找两个大CSV文件交集并添加file2的额外列

优化逻辑说明

  • 你原Python脚本执行慢的核心原因是时间复杂度太高:if row1 in lst2是线性查找,每对比一行就要遍历整个file2的所有行,整体复杂度是O(M*N),大文件下耗时必然极长,不管用哪种语言都需要先优化这一点。
  • 优化思路是先对file2构建哈希索引(字典),查找复杂度降到O(1),整体复杂度变成O(M+N),仅算法层面就能带来几十到上百倍的提速,搭配Julia的高性能执行效率,处理大文件的速度会远优于你现有的Python脚本。
  • 附加file2额外列的逻辑:匹配成功时直接拼接file1的行与file2中对应行的多余列即可。

Julia实现代码

首先你需要先安装依赖包,在Julia REPL中执行:

using Pkg
Pkg.add(["CSV", "DataFrames"])

整行匹配的实现(和你原有Python逻辑一致)

using CSV, DataFrames, Dates

# 配置参数
const FILE1_PATH = "compare_input2.csv"
const FILE2_PATH = "input.csv"
const OUTPUT_PATH = "output.csv"
const ENCODING = "ISO-8859-1"

println("开始执行: ", Dates.now())

# 读取file2构建索引字典:key为file2的整行元组,value为整行内容
file2_dict = Dict{Tuple, Vector}()
open(FILE2_PATH, encoding=ENCODING) do f
    reader = CSV.Reader(f, delim=',')
    for row in reader
        row_vec = collect(row)
        # 用tuple作为字典key(tuple是不可变类型可哈希)
        key = Tuple(row_vec)
        file2_dict[key] = row_vec
    end
end

println("file2索引构建完成,共$(length(file2_dict))行")

# 处理file1匹配并写入输出
open(OUTPUT_PATH, "w", encoding=ENCODING) do f
    writer = CSV.Writer(f, delim=',', quotechar='|', quoting=CSV.QUOTE_MINIMAL)
    match_count = 0
    total_count = 0
    open(FILE1_PATH, encoding=ENCODING) do f1
        reader1 = CSV.Reader(f1, delim=',')
        for row1 in reader1
            total_count += 1
            key1 = Tuple(collect(row1))
            if haskey(file2_dict, key1)
                # 拼接file1行 + file2中比file1多的列
                extra_cols = file2_dict[key1][length(row1)+1:end]
                output_row = vcat(collect(row1), extra_cols)
                write(writer, output_row)
                match_count += 1
            end
            # 打印进度
            if total_count % 10000 == 0
                print("\r已对比$total_count行,找到$match_count个匹配")
                flush(stdout)
            end
        end
    end
    println("\n处理完成,共匹配到$match_count行")
end

println("执行结束: ", Dates.now())

指定列作为匹配键的修改方法(更常用的场景)

如果两个文件是通过指定列(比如前2列作为唯一ID)匹配,只需要修改key的构造逻辑即可,示例如下:

# 构建file2索引的代码修改为,用前两列作为匹配键
key = Tuple(row_vec[1:2])
# 查找的代码对应修改为
key1 = Tuple(collect(row1)[1:2])

内容的提问来源于stack exchange,提问作者Shesha A.V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:27:03