kuroの覚え書き

96の個人的覚え書き

多数のテキストファイルからヘッダ行を除いて1つのファイルにまとめる

#!/bin/sh

#ls /target/multiannovar/filtered/files > list.txt
#list.txtを引数として
# $ sh ./input_files.sh list.txt

mkdir -p ./temp

filename=$1
for line in `cat ${filename}`
do
fname="${line##*/}"
#ファイルからヘッダ行を除く
sed -e '1d' $line > ./temp/"$fname".temp.txt
done
#すべてのファイルを結合
cat ./temp/*.temp.txt > ./temp/input.txt

これとほぼ等価なPythonスクリプトを作成してみた。
途中に生成されるファイルもなくてスッキリしているかも。

import glob
import csv
import os

if not os.path.exists("./temp"):
    os.makedirs("./temp")

lst = glob.glob("*/*.txt")
for f in lst:
    with open(f, 'r') as inp:
        reader = csv.reader(inp, delimiter='\t')
        next(reader)
        for row in reader:
            with open('./temp/input.txt', 'a') as oup:
                writer = csv.writer(oup, lineterminator='\n')
                writer.writerow(row)

長さも程よく短いし。
この場合入力ファイルはこのスクリプトと同じ場所となるので、実際の環境に合わせる必要がある。
このスクリプトの続きに先日作成したIDを追加する部分を足してやれば、スクリプト1発でSQLiteにインポートするファイルを生成できるわけだ。インポートはやはりどうしてもpythonから行えそうにないので、pythonからshell scriptを呼び出す方法を取らないとならないかな。

最初、生成されるファイルを元と同じディレクトリでinput.txtとしていて、ループがグルグル回って止まらなくなった。
なので出力されるファイルは別ディレクトリ推奨。