4

> 4 GB のファイル myfile.gz が与えられた場合、Teradata の fastload で使用できるようにパイプに zcat する必要があります。ファイル内の行数もカウントする必要があります。理想的には、ファイルを 1 回だけ通過させたいと考えています。awk を使用して行全体 ($0) を stdout に出力し、awk の END 句を使用して、行数 (awk の NR 変数) を別のファイル記述子 (outfile) に書き込みます。

awk を使用してこれを行うことができましたが、より Pythonic な方法が存在するかどうかを知りたいです。

#!/usr/bin/env python
from subprocess import Popen, PIPE
from os import path

the_file = "/path/to/file/myfile.gz"

outfile = "/tmp/%s.count" % path.basename(the_file)
cmd = ["-c",'zcat %s | awk \'{print $0} END {print NR > "%s"} \' ' % (the_file, outfile)]
zcat_proc = Popen(cmd, stdout = PIPE, shell=True)

パイプは、後で teradata の fastload への呼び出しによって消費されます。

"/dev/fd/" + str(zcat_proc.stdout.fileno())

これは機能しますが、awk をスキップして Python をより有効に活用できるかどうかを知りたいです。私は他の方法にもオープンです。この方法で処理する必要がある大きなファイルが複数あります。

4

4 に答える 4

7

どちらも Awk も必要ありませんzcat。gzip されたファイルの行数をカウントするには、

import gzip

nlines = sum(1 for ln in gzip.open("/path/to/file/myfile.gz"))

別のプロセスに渡すなど、行で何か他のことをしたい場合は、

nlines = 0
for ln in gzip.open("/path/to/file/myfile.gz"):
    nlines += 1
    # pass the line to the other process
于 2011-12-15T15:04:24.073 に答える
3

行数のカウントとgzip圧縮ファイルの解凍は、Python とその標準ライブラリを使用して簡単に実行できます。すべてを 1 つのパスで実行できます。

import gzip, subprocess, os
fifo_path = "path/to/fastload-fifo"
os.mkfifo(fifo_path)
fastload_fifo = open(fifo_path)
fastload = subprocess.Popen(["fastload", "--read-from", fifo_path],
                            stdin=subprocess.PIPE)
with gzip.open("/path/to/file/myfile.gz") as f:
    for i, line in enumerate(f):
         fastload_fifo.write(line)
    print "Number of lines", i + 1
os.unlink(fifo_path)

Fastload を呼び出す方法がわかりません。呼び出しで正しいパラメーターを代入してください。

于 2011-12-15T15:04:56.787 に答える
1

これは、bash の 1 行で実行できます。

zcat myfile.gz | tee >(wc -l >&2) | fastload

これにより、stderr に行数が出力されます。他の場所に置きたい場合は、wc の出力を好きなようにリダイレクトできます。

于 2011-12-15T19:20:57.433 に答える
0

実際には、データを Fastload にパイプすることはまったくできないはずなので、できれば正確な例をここに投稿していただければ幸いです。

Fastload 設定に関する Teradata のドキュメントから

FILE=filename 入力データを含むデータ ソースの名前を指定するキーワード句。fileid は通常のファイルを参照する必要があります。具体的には、パイプはサポートされていません

于 2015-03-10T17:51:34.953 に答える