我在csv中有一个示例数据集。它只有约5万行。我想针对此数据集测试SQL查询的性能,但是50K行太小了。提取现有csv并创建比原始csv大N倍的新csv,并且每行重复N次的最佳方法是什么?
例如,如果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解决方案,因为我正在跨多个数据库平台进行测试
答案 0 :(得分:4)
使用bash:
n=5
(head -n1 file; for i in $(seq 1 $n); do tail -n+2 file; done) > output.csv
head
命令显示标题。
for
运行命令tail
的5倍,该命令显示file
的内容,除了第一行(-n+2
将偏移量设置为第二行)。>
答案 1 :(得分:1)
由于您尚未指定要针对哪个RDBMS执行SQL,因此我将为您提供PostgreSQL解决方案。
首先,您可以使用COPY命令将CSV数据复制到PostgreSQL中。
然后,您可以使用generate_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倍。
答案 2 :(得分:1)
我为此目的制作了小型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。