通过复制记录创建大型数据集

2024-04-25 02:09:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在csv中有一个示例数据集。它只有5万行。我想对这个数据集测试SQL查询的性能,但是50K行太小了。采用现有csv并创建一个比原始csv大N倍且每行重复N次的新csv的最佳方法是什么?你知道吗

例如,如果N=5

输入csv为:

col1, col2, col3
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'

所需的输出csv为:

col1, col2, col3
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'

欢迎使用bash、python或SQL解决方案

首选bash或python解决方案,因为我正在跨多个数据库平台进行测试


Tags: csv数据方法bash示例sqlstringanother
3条回答

使用bash:

n=5
(head -n1 file; for i in $(seq 1 $n); do tail -n+2 file; done) > output.csv

head命令显示标题。你知道吗

for运行命令tail5次,该命令显示file的内容,但第一行除外(-n+2将偏移量设置为第二行)。你知道吗

因为您还没有指定要针对哪个RDBMS执行SQL,所以我将为您提供一个PostgreSQL解决方案。你知道吗

首先,可以使用COPY命令将CSV数据复制到PostgreSQL中。你知道吗

然后您可以使用generate\u series函数像这样扩展您的数据(CTE csv仅用于测试目的):

with srs as (
    select a
    from generate_series(0,99) a
),
csv as (
    select *
    from mycsv
)
select *
from csv
join srs on true

根据需要调整。这个生成的是CTE csv的99倍。你知道吗

我制作了一个小的python脚本:

# mulcsv.py 
import sys

def main(fname_in, fname_out, N):
    header = None
    content = []
    with open(fname_in, "r") as fin:
        for linenr, line in enumerate(fin,1):
            # remove NL? line = line.strip()
            if linenr==1:
                header = line
            else:
                content.append(line)

    with open(fname_out, "w") as fout:
        fout.write(header)
        for nr in range(N):
            fout.write("".join(content))
    print("Output in %s" % fname_out)

if __name__=="__main__":
    if len(sys.argv)!=4:
        print("Usage: %s <fname-in>.csv <fname-out>.csv N" % (sys.argv[0],))
        sys.exit(0)
    # TODO: check and parse arguments (in file existing, N is positive integer) - use argsparse?
    main(fname_in = sys.argv[1], fname_out = sys.argv[2], N = int(sys.argv[3]))
    # TESTING: main(fname_in = "r.csv", fname_out = "r2.csv", N = 5)

并称之为:

python mulcsv.py input.csv output.csv 5

要获得更好的参数验证/解析,请使用argsparse。你知道吗

相关问题 更多 >