如何统计多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里把判断逻辑调整为循环术语列表,检查术语是否在单元格内容中
- Shell脚本里把awk的判断改成
- 如果CSV文件用的是其他分隔符(比如制表符),可以修改Shell里的
-F','为-F'\t',Python里的csv.reader添加delimiter='\t'参数。
内容的提问来源于stack exchange,提问作者IG114
相关产品推荐
相关产品推荐

