Создать большой набор данных путем дублирования записей - PullRequest
0 голосов
/ 31 октября 2018

У меня есть пример набора данных в CSV. В нем всего ~ 50К строк. Я хочу протестировать производительность SQL-запросов по этому набору данных, но 50К строк слишком мало для этой цели. Каков наилучший способ взять существующий CSV и создать новый, который в N раз больше исходного, и каждая строка дублируется в 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, потому что я тестирую на нескольких платформах баз данных

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Я сделал небольшой скрипт на 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 .

0 голосов
/ 31 октября 2018

Использование bash:

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

Команда head отображает заголовок.

for запускает 5 раз команду tail, которая отображает содержимое file, за исключением первой строки (-n+2 устанавливает смещение для второй строки).

0 голосов
/ 31 октября 2018

Поскольку вы не указали, для какой СУБД вы планируете выполнять SQL, я дам вам решение для PostgreSQL.

Сначала вы можете скопировать данные CSV в PostgreSQL с помощью команды COPY .

Затем вы можете использовать функцию 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

Настройте в соответствии с вашими потребностями. Этот генерирует в 99 раз больше, чем в CTE CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...