You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何拆分大型CSV文件?及将分号分隔的单列CSV转为多列

Hey there! Let's tackle your two CSV-related questions one by one:

1. 如何拆分大型CSV文件?

拆分大型CSV文件的方法有很多,我给你推荐几种实用的方案,根据你的技术栈选择就行:

使用Python(适合熟悉代码的场景)

如果习惯用Python,两种方式都可以:

方案1:用Pandas分块读写

Pandas的read_csv支持按块读取,非常适合处理大文件,不会一次性把所有数据加载到内存:

import pandas as pd

# 定义每个拆分后文件的行数,根据你的内存情况调整,比如设为10000
chunk_size = 10000

# 遍历每个数据块,保存为独立文件
for chunk_idx, chunk in enumerate(pd.read_csv('large_file.csv', chunksize=chunk_size)):
    chunk.to_csv(f'large_file_part_{chunk_idx + 1}.csv', index=False)

方案2:用原生CSV模块(更省内存)

如果文件超大,Pandas可能还是占内存,用Python原生的csv模块更轻量:

import csv

chunk_size = 10000
current_part = 1

with open('large_file.csv', 'r') as infile:
    reader = csv.reader(infile)
    # 先读取表头
    header = next(reader)
    
    # 初始化第一个输出文件
    outfile = open(f'part_{current_part}.csv', 'w', newline='')
    writer = csv.writer(outfile)
    writer.writerow(header)
    row_counter = 0
    
    for row in reader:
        writer.writerow(row)
        row_counter += 1
        
        # 达到指定行数就切换到新文件
        if row_counter == chunk_size:
            current_part += 1
            outfile.close()
            outfile = open(f'part_{current_part}.csv', 'w', newline='')
            writer = csv.writer(outfile)
            writer.writerow(header)
            row_counter = 0
    outfile.close()

使用命令行工具(适合快速操作)

如果不想写代码,用系统自带的命令行工具更高效:

Linux/macOS(用split命令)

# 按行数拆分,每个文件10000行,输出文件前缀为part_
split -l 10000 large_file.csv part_

# 如果需要保留表头,先提取表头,再拆分数据行,最后合并表头到每个小文件
head -n 1 large_file.csv > header.csv
tail -n +2 large_file.csv | split -l 10000 - part_
for file in part_*; do cat header.csv "$file" > temp && mv temp "$file"; done

Windows(用PowerShell)

# 先读取表头
$header = Get-Content 'large_file.csv' -TotalCount 1
# 读取所有数据行(跳过表头)
$rows = Get-Content 'large_file.csv' | Select-Object -Skip 1
# 定义每个文件的行数
$chunkSize = 10000
$counter = 1

# 循环拆分并保存
for ($i=0; $i -lt $rows.Count; $i+=$chunkSize) {
    $header + $rows[$i..($i+$chunkSize-1)] | Out-File "part_$counter.csv"
    $counter++
}
2. 拆分单列CSV为多列(分号分隔数据)

看你给出的数据示例,这个文件本质是分号分隔的CSV,只是被当成单列加载了,有两种简单的处理方式:

方法1:读取时直接指定分隔符

最直接的方式是在读取Pandas DataFrame时,就告诉它分隔符是分号:

import pandas as pd

# 直接用sep=';'读取,Pandas会自动拆分列
df = pd.read_csv('your_single_column.csv', sep=';')

这样处理后,你的数据会自动分成insert_datecurrency_fromcurrency_tocurrency_value四个独立列。

方法2:已加载的DataFrame拆分单列

如果已经把数据加载成单列的DataFrame了,可以用str.split方法展开:

import pandas as pd

# 假设已加载的单列DataFrame叫df,列名是那串分号分隔的表头
df = pd.read_csv('your_single_column.csv')

# 提取表头(从第一列的列名拆分)
header = df.columns[0].split(';')

# 拆分每行数据,展开成多列
df = df.iloc[:, 0].str.split(';', expand=True)

# 设置列名
df.columns = header

备选:用CSV模块预处理

如果文件很大,用原生CSV模块先拆分再读取更高效:

import csv

# 先把分号分隔的内容转成标准CSV
with open('your_single_column.csv', 'r') as infile, open('split_result.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile, delimiter=';')
    writer = csv.writer(outfile)
    for row in reader:
        writer.writerow(row)

# 再用Pandas读取处理后的文件
df = pd.read_csv('split_result.csv')

内容的提问来源于stack exchange,提问作者Clayton Marquardt

火山引擎 最新活动