Blog/Format Guides/How to Merge Multiple CSV Bank Statements into One File
📊

How to Merge Multiple CSV Bank Statements into One File

9 min readJanuary 28, 2025

Quick Answer {#quick-answer}

To merge multiple CSV bank statements, standardize their column headers first (use QuickBankConvert to convert all source PDFs with consistent formatting), then combine using Excel's Power Query, Google Sheets, Python pandas, or a simple command-line cat command. Always remove duplicate header rows and sort by date after merging.


When You Need to Merge Multiple Bank Statement CSVs {#when-to-merge}

Merging multiple CSV bank statement files is one of the most common tasks in personal and business financial management. Common scenarios include:

Annual tax preparation: Converting 12 monthly statements into individual CSVs, then merging them into one complete-year ledger for your accountant.

Multi-account reconciliation: Combining checking, savings, and business account exports into a single master spreadsheet for consolidated reporting.

Multi-bank consolidation: If you bank at Chase for personal accounts and Wells Fargo for business, merging both into one file gives you a complete financial picture.

Audit trail preparation: Auditors often want a single continuous transaction record. Merging several years of monthly CSVs into one file per year makes the audit package cleaner.

Mortgage application: Lenders often want 3-6 months of transactions across all accounts. A merged file is cleaner to provide than multiple separate documents.

The main challenge with merging is maintaining consistent column structure. Different banks format their CSV exports differently — Chase uses "Posting Date" while Bank of America uses "Date," for example. Converting all statements through QuickBankConvert first normalizes the column structure, making the merge trivial.


Preparing Your CSV Files Before Merging {#prepare-files}

Successful merging requires consistent files. Before you merge, verify:

1. All files have identical column headers

Open each CSV and check that the first row uses exactly the same column names and order. If you converted through QuickBankConvert, this is automatic. If you downloaded directly from banks, you may need to rename or reorder columns first.

Standard normalized columns from QuickBankConvert:

Date, Description, Debit, Credit, Balance

2. Dates are in the same format

All dates should be in a consistent format. ISO format (YYYY-MM-DD) is best for sorting:

2024-03-15  ← preferred
03/15/2024  ← also works if consistent
15/03/2024  ← will sort incorrectly if mixed with US format

3. Amounts use consistent notation

Check that negatives are consistent — either all debits are negative numbers, or all use separate Debit/Credit columns. Mixing conventions creates accounting errors.

4. No extra rows at top or bottom

Some bank CSV exports include summary rows before the transactions (like "Statement Period: Jan 2024") or totals rows at the bottom. Remove these before merging — they will appear as data rows in the merged file.

Callout: Name your files systematically

Before merging, rename your CSVs using a consistent convention: 2024-01_Chase_Checking.csv, 2024-02_Chase_Checking.csv, etc. This makes it easy to spot gaps in your coverage and keeps files sorted chronologically in your file explorer.


Method 1: Merge CSVs in Excel {#merge-in-excel}

Excel's Power Query is the most robust method for merging CSVs without risking format corruption.

Using Power Query (Excel 2016 and Later)

  1. Open a blank Excel workbook
  2. Go to DataGet DataFrom FileFrom Folder
  3. Navigate to the folder containing all your CSV bank statement files
  4. Click CombineCombine & Load
  5. Power Query will preview the first file — confirm the column layout looks correct
  6. Click OK — Power Query merges all CSVs in the folder into a single table

Power Query adds a "Source.Name" column identifying which file each row came from — useful for tracking which month/account each transaction belongs to. You can delete this column or rename it to "Month" or "Account."

Using Copy-Paste (Simple, Small Files)

For small numbers of files (2-4 months):

  1. Open all CSV files as separate workbooks in Excel
  2. In the first workbook, select all data rows (not the header row) from the second file
  3. Copy and paste below the existing data in the first file
  4. Repeat for each additional file
  5. Sort the combined data by the Date column

Warning: The header row from each additional file will be pasted as a data row. After pasting all files, filter the data and delete any rows where the "Date" column equals "Date" (the header text).


Method 2: Merge CSVs in Google Sheets {#merge-in-google-sheets}

Google Sheets can import and merge CSVs using its IMPORTDATA function or Apps Script.

Using IMPORTDATA (Simple Method)

In a new Google Sheet, use IMPORTDATA to pull each CSV:

=IMPORTDATA("https://docs.google.com/...")

Note: IMPORTDATA only works with URLs, not local files. For local files, use the upload method below.

Using File Upload and Paste

  1. Upload each CSV to Google Drive
  2. Open each as a Google Sheet (right-click → Open With → Google Sheets)
  3. In a master sheet, use =IMPORTRANGE() to pull data from each individual sheet:
=IMPORTRANGE("spreadsheet_id", "Sheet1!A2:E")
  1. Stack the IMPORTRANGE formulas in separate rows

Using Apps Script (For Automation)

If you regularly merge 12 monthly CSVs, automate it with Google Apps Script:

function mergeBankStatements() {
  const masterSheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Merged');
  const folder = DriveApp.getFoldersByName('BankStatements').next();
  const files = folder.getFilesByType('text/csv');

  let allData = [];
  let headerAdded = false;

  while (files.hasNext()) {
    const file = files.next();
    const content = file.getBlob().getDataAsString();
    const rows = Utilities.parseCsv(content);

    if (!headerAdded) {
      allData.push(rows[0]); // Add header once
      headerAdded = true;
    }
    // Skip header row (index 0) for subsequent files
    for (let i = 1; i < rows.length; i++) {
      allData.push(rows[i]);
    }
  }

  masterSheet.clearContents();
  masterSheet.getRange(1, 1, allData.length, allData[0].length)
    .setValues(allData);
}

Method 3: Merge CSVs with Python {#merge-with-python}

Python's pandas library is the most flexible and powerful method for merging CSVs, especially for large files or complex column normalization.

Basic pandas Merge

import pandas as pd
import glob

# Read all CSV files from a directory
csv_files = glob.glob('/path/to/statements/*.csv')

# Read and concatenate all files
dfs = []
for f in csv_files:
    df = pd.read_csv(f)
    df['source_file'] = f  # Track which file each row came from
    dfs.append(df)

merged = pd.concat(dfs, ignore_index=True)

# Sort by date
merged['Date'] = pd.to_datetime(merged['Date'])
merged = merged.sort_values('Date')

# Remove duplicate rows if any
merged = merged.drop_duplicates()

# Save merged file
merged.to_csv('merged_bank_statements.csv', index=False)
print(f"Merged {len(csv_files)} files: {len(merged)} total rows")

Handling Different Column Names

If your CSVs come from different banks with different column names:

# Define a column mapping for each bank format
column_maps = {
    'chase': {'Transaction Date': 'Date', 'Description': 'Description',
               'Amount': 'Amount'},
    'boa': {'Date': 'Date', 'Payee': 'Description',
              'Amount': 'Amount'},
}

def normalize_columns(df, bank_name):
    mapping = column_maps.get(bank_name, {})
    return df.rename(columns=mapping)[['Date', 'Description', 'Amount']]

Method 4: Merge CSVs from the Command Line {#merge-command-line}

For tech-savvy users, the command line offers the fastest way to merge CSVs.

Mac / Linux

# Merge all CSVs, keeping only the first header
head -1 jan.csv > merged.csv
tail -n +2 -q *.csv >> merged.csv

Or using awk to skip headers from all but the first file:

awk '(NR == 1) || (FNR > 1)' *.csv > merged.csv

Windows (Command Prompt)

copy /b *.csv merged.csv

Warning: Windows copy /b includes all header rows. Open merged.csv and manually delete the extra header rows that appear between data sections.

Windows (PowerShell)

$header = $null
Get-ChildItem *.csv | ForEach-Object {
    $content = Import-Csv $_
    if (-not $header) {
        $header = $content | Export-Csv merged.csv -NoTypeInformation
    } else {
        $content | Export-Csv merged.csv -NoTypeInformation -Append
    }
}

After merging, always sort your combined file by date and run a quick sum check: total all debits and credits and verify they are consistent with what you expect from the individual monthly totals. For a broader workflow that includes converting PDFs before merging, see our batch conversion guide. Start your conversions at QuickBankConvert to ensure all your CSVs have consistent columns before you merge.

Frequently Asked Questions

How do I merge multiple CSV bank statements without duplicates?
After merging, sort all rows by date and then use Excel's "Remove Duplicates" feature (Data → Remove Duplicates) selecting all columns, or filter by duplicate date+amount+description combinations. Converting from QuickBankConvert ensures consistent column headers across all files, which makes deduplication more reliable.
Can I merge CSVs from different banks into one file?
Yes, as long as the column structure is standardized. Convert all statements through QuickBankConvert first — it outputs a consistent column format (Date, Description, Debit, Credit, Balance) regardless of the source bank. Then merge the files and add a "Bank" or "Account" column to identify the source of each row.
What is the fastest way to merge 12 monthly bank statement CSVs?
The fastest method is a single command-line operation: on Mac/Linux, `cat *.csv | grep -v "^Date" > merged.csv` removes duplicate headers and combines all CSVs. On Windows, `type *.csv > merged.csv` combines the files (you'll need to manually remove extra header rows afterward).
Will merging CSVs mess up my date formats?
Potentially, if different CSVs use different date formats. QuickBankConvert outputs a standardized ISO date format (YYYY-MM-DD) across all conversions, eliminating this problem. If merging CSVs from different sources, normalize the date column to a single format before merging.

Ready to convert your bank statement?

Free. Private. Instant. Your files never leave your browser.

Convert Your Statement