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

如何统计多CSV文件前500行指定词列表的出现次数及批量处理

解决方案:统计CSV文件前500行的术语出现次数

嘿,作为经常处理这类文本统计需求的人,我来给你一步步讲清楚怎么弄,完全适合编程新手~

首先直接回答你的核心疑问:不需要生成仅含前500行的新文件,不管用Shell脚本还是Python代码,都能直接读取文件的前500行进行处理,既省磁盘空间,又省步骤。下面给你两种实用的方法,按需选择:


方法一:用Shell脚本(无需额外安装工具,系统自带)

这种方法适合不想写复杂代码的新手,直接用系统自带的命令就能搞定。

步骤1:准备好你的术语文件

确保words.txt在当前目录,每行一个术语,尽量不要有多余的空格或空行(如果有空行也没关系,脚本会自动跳过)。

步骤2:写Shell脚本

新建一个文本文件,命名为count_terms.sh,把下面的代码复制进去:

#!/bin/bash

# 先检查术语文件是否存在
if [ ! -f "words.txt" ]; then
    echo "❌ 错误:当前目录没找到words.txt,请确认文件位置!"
    exit 1
fi

# 遍历当前目录下所有CSV文件
for csv_file in *.csv; do
    # 跳过不是文件的情况(比如子目录)
    if [ ! -f "$csv_file" ]; then
        continue
    fi

    echo "=== 📄 统计文件: $csv_file ==="
    # 逐个读取术语并统计前500行的出现次数
    while read term; do
        # 跳过空行
        if [ -z "$term" ]; then
            continue
        fi
        # 用awk精确匹配CSV的每个字段,避免部分匹配(比如术语"cat"不会匹配"category")
        count=$(head -500 "$csv_file" | awk -F',' -v term="$term" '{for(i=1;i<=NF;i++) if($i == term) count++} END{print count+0}')
        echo "$term: $count"
    done < words.txt
    echo "" # 空行分隔不同文件的结果
done

步骤3:运行脚本

打开终端,进入文件所在目录,执行以下命令:

# 给脚本添加执行权限
chmod +x count_terms.sh
# 运行脚本
./count_terms.sh

方法二:用Python脚本(更直观,适合新手学习)

如果以后需要扩展功能(比如处理复杂CSV、导出统计结果),Python会更灵活。

步骤1:准备环境

确保你的电脑安装了Python(大部分系统自带,没有的话去官网下载安装即可)。

步骤2:写Python脚本

新建一个文本文件,命名为count_terms.py,复制下面的代码:

import csv
import os

# 读取术语列表的函数
def load_terms(term_file):
    terms = []
    try:
        with open(term_file, 'r', encoding='utf-8') as f:
            for line in f:
                term = line.strip()
                if term:  # 跳过空行
                    terms.append(term)
        return terms
    except FileNotFoundError:
        print(f"❌ 错误:没找到术语文件 {term_file}")
        exit(1)

# 统计单个CSV文件前500行术语次数的函数
def count_terms_in_csv(csv_path, terms):
    term_counts = {term: 0 for term in terms}
    try:
        with open(csv_path, 'r', encoding='utf-8') as f:
            reader = csv.reader(f)
            line_num = 0
            for row in reader:
                line_num += 1
                if line_num > 500:
                    break  # 只处理前500行
                # 遍历每行的每个单元格
                for cell in row:
                    cell_content = cell.strip()
                    if cell_content in term_counts:
                        term_counts[cell_content] += 1
        return term_counts
    except Exception as e:
        print(f"⚠️ 处理文件 {csv_path} 时出错:{str(e)}")
        return None

def main():
    term_file = "words.txt"
    terms = load_terms(term_file)
    if not terms:
        print("❌ 错误:术语文件里没有有效术语!")
        exit(1)
    
    # 找到当前目录下所有CSV文件
    csv_files = [f for f in os.listdir('.') if f.endswith('.csv') and os.path.isfile(f)]
    if not csv_files:
        print("⚠️ 当前目录下没有找到CSV文件!")
        exit(1)
    
    # 逐个处理每个CSV文件并输出结果
    for csv_file in csv_files:
        print(f"=== 📄 统计文件: {csv_file} ===")
        counts = count_terms_in_csv(csv_file, terms)
        if counts:
            for term, count in counts.items():
                print(f"{term}: {count}")
        print()  # 空行分隔不同文件的结果

if __name__ == "__main__":
    main()

步骤3:运行脚本

打开终端,进入文件所在目录,执行:

# 运行脚本(用python3如果系统默认是python2)
python count_terms.py

针对大量文件的处理说明

不管用哪种方法,都是逐个处理文件,每次只加载一个文件的前500行到内存,所以即使有几百上千个CSV文件也能轻松应对,不会出现内存不足的问题。唯一的区别是处理时间会随着文件数量增加而变长,但这是正常的,毕竟要逐个处理嘛。

额外小提示

  • 如果你的术语需要部分匹配(比如术语是"app",要匹配"apple"),可以修改代码:
    • Shell脚本里把awk的判断改成if($i ~ term)
    • Python里把判断逻辑调整为循环术语列表,检查术语是否在单元格内容中
  • 如果CSV文件用的是其他分隔符(比如制表符),可以修改Shell里的-F','为-F'\t',Python里的csv.reader添加delimiter='\t'参数。

内容的提问来源于stack exchange,提问作者IG114

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:59:25