如何将多个结构一致的CSV文件合并为单个按name列排序的CSV文件
多CSV合并重排实现方案
方案1:Python 实现(全平台兼容)
将所有待合并的CSV文件放在同一个目录下,无需修改文件名,执行以下代码即可输出符合预期的合并结果。
import os import csv # 待合并CSV存放的文件夹路径,可根据实际情况修改 csv_dir = "./csv_files" all_values = [] # 遍历读取所有CSV的value列 for filename in os.listdir(csv_dir): if not filename.endswith(".csv"): continue file_path = os.path.join(csv_dir, filename) with open(file_path, "r", encoding="utf-8") as f: reader = csv.reader(f, delimiter=" ", skipinitialspace=True) next(reader) # 跳过表头 for row in reader: if row: # 跳过空行 all_values.append(row[1]) # 写入合并后的CSV output_path = "./merged.csv" with open(output_path, "w", encoding="utf-8", newline="") as f: writer = csv.writer(f, delimiter="\t") writer.writerow(["name", "value"]) for idx, value in enumerate(all_values, start=1): writer.writerow([f"n{idx}", value])
如果你确实需要按原文件中name列的数值排序(即所有文件的n1排在最前,其次是所有n2,以此类推),可以修改读取逻辑为:
all_rows = [] for filename in os.listdir(csv_dir): if not filename.endswith(".csv"): continue file_path = os.path.join(csv_dir, filename) with open(file_path, "r", encoding="utf-8") as f: reader = csv.reader(f, delimiter=" ", skipinitialspace=True) next(reader) for row in reader: if row: name_num = int(row[0].strip("n")) all_rows.append((name_num, row[1])) # 按原name的数值排序 all_rows.sort(key=lambda x: x[0])
注意:如果你的CSV是逗号分隔,只需要把上述代码里的分隔符参数改成逗号即可。
方案2:Shell 命令实现(适用于Linux/macOS)
一行命令即可完成符合预期结果的合并:
# 合并所有csv,跳过表头,重新生成连续name列 awk 'FNR>1 {print $2}' *.csv | awk 'BEGIN{print "name\tvalue"} {print "n"NR"\t"$1}' > merged.csv
如果需要按原name列的数值排序,使用以下命令:
awk 'FNR>1 {print substr($1,2) "\t" $2}' *.csv | sort -n | awk 'BEGIN{print "name\tvalue"} {print "n"$1"\t"$2}' > merged.csv
内容的提问来源于stack exchange,提问作者Xianghui Huang
相关产品推荐
相关产品推荐

