首页 > 解决方案 > 将文本文件中的不一致数据合并到一个 Excel 电子表格中

问题描述

我有大量带有数据的文本文件;每个文件都可以单独导入excel。但是,虽然文件之间的大多数列是相同的,但在许多文件中添加/缺少一列或两列,因此当我合并所有文本文件并将其放入 excel 时,许多数据列被移动。

我可以为所有可能的数据条目制作一个“主列表”,但我不确定如何告诉 excel 将某些类型的数据放在特定的列中。

例如,如果我有两个看起来像这样的文件:

我将如何在excel中像这样合并它们:

标签: pythonexcelopenpyxl

解决方案


问题:将文本文件中的不一致数据合并到一个 Excel 电子表格中

此解决方案使用以下build-inmoudules

该解决方案的核心是使用对象和 参数对列名进行规范化,以处理不一致的列。set()
.DictWriter(..., extrasaction='ignore')

输出格式为CSV,可以从 MS-Excel 中读取。


  • 给定的数据,由blank

    text1 = """Name Year Food Color
    Bob 2018 Cake Blue
    Charlie 2017 Figs Red
    """
    text2 = """LastName Name Age Year Color Size
    Lily James 17 2021 green 0
    """
    
  • 打开三个文件并获取标题。
    聚合所有列名,使用set(). 为文件
    创建一个DictReader对象。in_*

    注意:替换io.StringIO(...open(<Path to file>)

    with io.StringIO(text1) as in_text1, \
         io.StringIO(text2) as in_text2, \
         io.StringIO() as out_csv:
    
        columns = set()
        reader = []
        for n, fh in enumerate([in_text1, in_text2]):
            fieldnames = fh.readline().rstrip().split()
            [columns.add(name) for name in fieldnames]
            reader.append(csv.DictReader(fh, delimiter=' ', fieldnames=fieldnames))
    
  • 使用规范化的列名创建一个DictWriter对象。参数,处理不一致的列。 extrasaction='ignore'

    注意:保证列顺序。如果您需要定义的顺序,list(columns)请在分配给 之前根据您的需要对 进行排序fieldnames=

        writer = csv.DictWriter(out_csv, fieldnames=list(columns), , extrasaction='ignore')
        writer.writeheader()
    
  • 循环DictReader读取所有行的所有对象并将其写入目标.csv文件。

        for dictReader in reader:
            for _dict in dictReader:
                writer.writerow(_dict)
    

输出

print(out_csv.getvalue())

Color,LastName,Year,Food,Age,Name,Size
Blue,,2018,Cake,,Bob,
Red,,2017,Figs,,Charlie,
green,Lily,2021,,17,James,0

用 Python 测试:3.4.2


推荐阅读