.csvでサンプル行を出力する方法は?

.csvでサンプル行を出力する方法は?

私は多くのデータマージ印刷を行っており、大規模なデータベースから10個のサンプルを出力できるようにしたいです。私の目標は、提供された.csv(最初の行と最後の行を含む)から均等な間隔の10行を抽出して新しい.csvファイルに出力することです。

答え1

この回答では、csvファイルに1行に1行があるとします。つまり、連続した行がないことを意味します。ファイル名がある場合は、db.csv次のコマンドを使用して最初の行と最後の行を含む10行を取得できます。

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

どのように動作しますか?

csvファイルはコマンドラインに2回表示されるため、awk2回読み取られます。最初は、行の総数を取得するために使用されます。 2番目の時間は、選択した10行を印刷するために使用されます。

  • FNR==NR{next}

    NRこれまでに読み取ったレコード(行)の総数。ファイルレコード番号は、FNRこれまでこのファイルから読み取ったレコード(行)の総数と同じです。それで、当時FNR==NR私たちはまだ最初のファイルを読んでいました。もしそうなら、nextレコードに移動します。

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

    このコマンドに到達すると、2番目の読み取りの最初の行にあることを意味します。この場合、ファイルの総レコード数があることがわかりますNR-1。この番号をn

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

    2行目の最初の行を読みFNR==1x=0。だからFNR>x我々はその行を印刷します。その後、一度に1行ずつ増やしてx印刷します。n/9FNR>x

    この条件をFNR==n使用すると、ファイルの最後の行が印刷されます。

はい

101行のファイルを作成しましょう。

$ seq 101 >db.csv

次のコマンドを使用して、awkファイルの最初の行と最後の行を含む10行を印刷できます。

$ 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

答え2

以下を試してください

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

これは Windows の Linux 置換に適用されます。

INTO OUTFILE '/tmp/output.csv'

そして

INTO OUTFILE 'c:\output.csv'

答え3

CSVファイルが制限されず、フィールド値に改行とカンマが含まれている場合は、Pythonで使用できる標準ライブラリの1つなどの実際のCSV解析ライブラリを使用する必要があります。

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

関連情報