我的批处理文件应该有啥代码将多个 CSV 文件合并到一个新的单个 Excel 工作簿中,但每个 CSV 文件都有自己的工作表?

Posted

技术标签:

【中文标题】我的批处理文件应该有啥代码将多个 CSV 文件合并到一个新的单个 Excel 工作簿中,但每个 CSV 文件都有自己的工作表?【英文标题】:What code should my batch file have to merge multiple CSV files into a new single Excel workbook, but each CSV file to have it's own sheet?我的批处理文件应该有什么代码将多个 CSV 文件合并到一个新的单个 Excel 工作簿中,但每个 CSV 文件都有自己的工作表? 【发布时间】:2020-10-02 15:38:00 【问题描述】:

我正在尝试获取多个 CSV 文件并将它们合并到一个 Excel 工作簿中,但将每个 CSV 文件作为自己的工作表保留在同一个工作簿中((1)一个 Excel 文件/工作簿,(3)三个单独的工作表)。我正在使用批处理文件来执行此操作。我正在编写的批处理文件运行我为下载 CSV 文件而编写的 python 脚本,那么为批处理文件创建另一个 python 脚本以运行以创建这个单张、多页工作簿会更容易吗?关于哪个更容易以及如何完成的任何想法?现在感觉就像一团糟。

我尝试将 3 个 CSV 文件(它们包含相同的标题,每个文件的数据值不同)合并到一个 CSV 文件中,但它只是将所有数据显示在一张接一张的单张纸上,没有任何标签告诉您您正在查看另一个 CSV 文件。

(我刚刚学习编码(大约一个月前开始),注释掉的部分是我尝试过但没有用的东西)

::copy .\Output\*.csv .\Output\merged.csv
::"CLE_*"+"TOL_*"+"BUF_*" merged.csv
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do set datevar=%%e-%%f-%%g
::for %%a in (*.xlsx) do start "" "%%a"
for %%a in (./Output/*%datevar%.csv) do start "C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" "./Output/%%a"
::for /f "tokens=1-5 delims=/ " %%d in ("%date%") do start "C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" ".\Output\*%%e-%%f-%%g.csv"
exit

【问题讨论】:

CSV 文件(特定文本文件)没有选项卡,批处理文件无法与 Excel 交互... 您需要选择不同的脚本语言。应该能够在 Vbscript、Python 或 Excel VBA 宏中执行此操作。 【参考方案1】:

只是为了消除误解。您不想将数据合并到一个表(工作表)中,但您希望在一个 excel 文档中为每个 csv 文件使用具有相同标题的单独工作表?

由于您已经使用 python 脚本下载了 csv 文件,因此您可以使用 csv 模块读取文件,然后使用 openpyxl 模块将它们复制到 Excel 文档中的单独工作表中。

您必须在下面将“data/”子文件夹更改为您的位置,并将 csv-delimiter 设置为您的 csv 分隔符:

import os
import csv
import openpyxl as xl

files = ['data/'+ f for f in os.listdir('data')]

wb = xl.Workbook()
wb.remove_sheet(wb.active)


i = 0
for ff in files:
    with open(ff) as f:
        i += 1
        ws = wb.create_sheet(f'File i')
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            ws.append(row)

wb.save('file.xlsx')

【讨论】:

【参考方案2】:

可以从一个目录加载 .csv 文件并将它们全部合并到一个 .xlsx excel 文件中,.csv 文件的每个内容在单独的工作表上。这是使用 Pandas 的代码:

import pandas as pd
import sys
import os
import glob
from pathlib import Path

extension = 'csv'
all_filenames = [i for i in glob.glob('*.'.format(extension))]

writer = pd.ExcelWriter('fc15.xlsx') # Arbitrary output name
for csvfilename in all_filenames:

    # in case your locale settings use , instead of a dot
    txt = Path(csvfilename).read_text()
    txt = txt.replace(',', '.')

    text_file = open(csvfilename, "w")
    text_file.write(txt)
    text_file.close()
    
    print("Loading "+ csvfilename)
    df= pd.read_csv(csvfilename,sep=';', encoding='utf-8')

    df.to_excel(writer,sheet_name=os.path.splitext(csvfilename)[0])
    print("done")
writer.save()
print("task completed")

【讨论】:

以上是关于我的批处理文件应该有啥代码将多个 CSV 文件合并到一个新的单个 Excel 工作簿中,但每个 CSV 文件都有自己的工作表?的主要内容,如果未能解决你的问题,请参考以下文章

如何批处理将多个文件夹下的excel文件(xls,xlsx,csv等)合并成一个文件?

如何打破大型csv文件,在多个核心上处理它并使用nodeJs将结果合并为一个

pyspark 将多个 csv 文件合并为一个

如何将多个csv按行合并?(不是首尾相接的按列合并)

Spring Batch中如何读取多个CSV文件合并数据进行处理?

如何将多个 csv 文件合并为单个 csv 文件