Como posso gerar linhas de amostra de um .csv?

0

Estou fazendo muita impressão de mesclagem de dados e gostaria de produzir, digamos, 10 amostras de um grande banco de dados. Meu objetivo seria extrair as 10 linhas distribuídas uniformemente do arquivo .csv fornecido (incluindo a primeira e a última linha) e gerar isso como um novo arquivo .csv.

    
por Ade 11.02.2015 / 05:49

3 respostas

1

Esta resposta assume que o seu arquivo csv tem uma linha por linha, o que significa que não há linhas contínuas. Se o arquivo for chamado de db.csv , você poderá obter 10 linhas, incluindo a primeira e a última usando:

awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv

Como funciona

Como o arquivo csv está listado duas vezes na linha de comando, awk o lerá duas vezes. O primeiro é usado para obter o número total de linhas. A segunda vez é usada para imprimir as 10 linhas selecionadas.

  • FNR==NR{next}

    NR é o número total de registros (linhas) lidos até o momento.O número do registro do arquivo, FNR , é igual ao número total de registros (linhas) lidos tão longe desse arquivo. Então, quando FNR==NR , ainda estamos lendo o primeiro arquivo. Em caso afirmativo, apenas pulamos para o registro next .

  • FNR==1{n=NR-1}

    Se chegarmos a este comando, isso significa que estamos na primeira linha do segundo passo. Nesse caso, sabemos que o número total de registros no arquivo é NR-1 . Nós salvamos esse número como n .

  • FNR>x || FNR==n{x+=n/9;print}

    Uma na primeira linha da segunda leitura, FNR==1 e x=0 . Assim, FNR>x e nós imprimimos essa linha. Em seguida, incrementamos x por n/9 e imprimimos uma linha na próxima vez que FNR>x e assim por diante.

    A condição FNR==n garante que a última linha do arquivo será impressa.

Exemplo

Vamos criar um arquivo com 101 linhas:

$ seq 101 >db.csv

Agora, podemos usar nosso comando awk para imprimir 10 linhas do arquivo, incluindo a primeira e a última:

$ awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
1
12
23
34
45
57
68
79
90
101
    
por 11.02.2015 / 06:47
0

Tente o seguinte

SELECT your_column1, your_column2
FROM your_table_name
INTO OUTFILE '/tmp/ouput.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Isso funciona para o linux     no windows substitua

INTO OUTFILE '/tmp/output.csv'

com

INTO OUTFILE 'c:\output.csv'
    
por 11.02.2015 / 06:00
0

Se seus arquivos CSV não forem restritos e contiverem novas linhas e vírgulas dentro dos valores do campo, você deverá usar uma biblioteca de análise de CSV real, por exemplo, o padrão disponível em python:

import csv

def select_evenly(file_name, nr):
    rows = []
    with open(file_name) as fp:
        for row in csv.reader(fp):
            rows.append(row)
    nr_rows = len(rows)
    step = (nr_rows - 2.0) / (nr - 1)
    yield rows[0]
    for x in range(1, nr-1):
        yield rows[int(x * step + 0.5)]
    yield rows[-1]

for line in select_evenly("test.csv", 10):
    print line
    
por 11.02.2015 / 12:53