私は多くのデータマージ印刷を行っており、大規模なデータベースから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回表示されるため、awk
2回読み取られます。最初は、行の総数を取得するために使用されます。 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==1
、x=0
。だからFNR>x
我々はその行を印刷します。その後、一度に1行ずつ増やしてx
印刷します。n/9
FNR>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