1

私はPythonとスクリプトを初めて使用します。

Excelでこのように見える12列と数千行のテーブルの巨大なcsvファイルがあります(5つの連続するパイプ記号は新しいセルを示しているため、この例は3行と3列で構成されています)。

G "、 '32'、 '0'、 '0.98%'、" 1E0 ||||| G "、 '32'、 '0'、 '1%'、" 1E0 ||||| A "、 '48'、 '47'、 '97 .92%'、" 7.6145E-27

G "、 '32'、 '0'、 '12%'、" 1E0 ||||| G "、 '32'、 '0'、 '3%'、 "1E0 ||||| A "、 '1'、 '47'、 '97.9%'、" 7.6145E-27

G "、 '32'、 '0'、 '0%'、" 1E0 ||||| G "、 '32'、 '32'、 '0%'、" 1E0 ||||| A "、 '1'、 '47'、 '9.92%'、" 7.6145E-27

ご覧のとおり、各セルは5つのコンマ区切り要素で構成されています。最後から2番目の要素(パーセンテージ値を持つ要素)にのみ関心があります。この値に小数が含まれる場合と含まれない場合があることに注意してください。つまり、これは、その4番目の要素を検索し、他の要素が破棄される新しいファイルに書き込むために作成したコードです。

import sys
import csv
import re

with open(sys.argv[1],"r") as f_input:
   read_f_input = csv.reader(f_input, delimiter=',')
   with open("f_output.csv", "wt") as f_output:
      f_outputwriter=csv.writer(f_output, delimiter=',')
      for row in read_f_input:
         genotype = re.search(r"[\d+\.]+%", [row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11]])
         result= genotype.group(0)
         f_outputwriter.writerow([result])

このスクリプトは、最後から3番目の行のために機能しません:genotype = ...これを単一の列(他の11列を無視)でのみ実行するとスクリプトが機能するようになりましたが、実行したい12列すべてで同時に正規表現を操作し、結果を同じテーブル形式で書き込みます。誰かが私がこのトリッキーな変換を行う方法を知っていますか?前もって感謝します!

4

3 に答える 3

1

row[3]必要なデータは、row[7]、およびだけではありrow[11]ませんか? すべての行が同じであるため、必要な列は既にわかっているようです。したがって、正規表現を使用して目的の列を見つけようとする必要はありません。また、もちろん、正規表現はリストを検索しないので、それらを結合して文字列に戻す必要がありますが、その場合、結合するだけで CSV リーダーを使用して分割する必要はありません。それを検索するために戻る?要するに、正規表現があなたの述べた目標と何の関係があるのか​​ わかりません.あなたはそれを考えすぎているかもしれません.

于 2012-05-10T23:39:59.473 に答える
0

気に入った解決策が見つかったかどうかはわかりませんが、以下のコードを約 10 分で作成しました。次のように、箱から出してすぐに実行できるはずです。

python process_data.py --file=data.txt

出力

G",'32','0','1.960000.2%',"1E0 ||||| G", '32', '0','2.000000.2%', "1E0 ||||| A"、"48"、"47"、"195.840000.2%"、"7.6145E-27 G"、"32"、"0"、"24.000000.2%"、"1E0 ||||| G", '32', '0','6.000000.2%', "1E0 ||||| A」、「1」、「47」、「195.800000.2%」、「7.6145E-27 G」、「32」、「0」、「0.000000.2%」、「1E0 ||||| G", '32', '32','0.000000.2%', "1E0 ||||| A"、"1"、"47"、"19.840000.2%"、"7.6145E-27

コードを出力するだけですが、各行を反復処理するときに csv.writer または file.writeline を簡単に使用できます。以下のコードの優れた点は、セル区切り記号と必要な値の位置を知っている限り、行にいくつのセルがあるかは問題ではないということです。一列。

% を削除するのは少しハックですが、データ形式を知っていれば安全です。また、float() への変換の前後に例外ブロックをスローして、実行中に発生したエラーの数を追跡することもできます。

#!/usr/bin/python

import os, sys, pdb, re
# NOTE: This has been deprecated you should use ArgumentParser
from optparse import OptionParser

__version__ = '$Id$'

DEFAULT_CELL_SEP = '|||||'
DEFAULT_CELL_COL_SEP = ','

parser = OptionParser(version=__version__, usage='Usage: %prog --fille=data_file [--      csep=cell_seperator --ccsep=cell_col_seperator]')
parser.add_option('-f','--file',dest='data_file', 
              help='File to process')
parser.add_option('--csep',dest='cell_sep', default=DEFAULT_CELL_SEP,
              help='Cell Separator')
parser.add_option('--ccseip', dest='cell_col_sep', default=DEFAULT_CELL_COL_SEP,
              help='Column Separator for each cell')

def process_col_four(cell, cell_col_sep=DEFAULT_CELL_COL_SEP, suffix='%'):
    cols = cell.split(cell_col_sep)
    # Do what you need to do...
    # pdb.set_trace()
    col_4 = cols[3].replace(' ','')
    col_4 = float(col_4[1:-2])
    col_4 = col_4 *2
    cols[3] = "'%f.2%s'" % (col_4, suffix)
    return ','.join(cols)
    # return cols

def main(data_file, cell_sep=DEFAULT_CELL_SEP, cell_col_sep=DEFAULT_CELL_COL_SEP):
    data_dir = os.path.dirname(data_file)
    output_file, ext = os.path.splitext(os.path.basename(data_file))
    output_file = output_file + '_recode' + ext
    output_path = os.path.join(data_dir, output_file)

    with open(data_file, 'r') as data_reader:
        for line in data_reader:
            cells = line.strip().split(cell_sep)
             new_cells = map(process_col_four, cells)
             # pdb.set_trace()
             new_line = cell_sep.join([cell for cell in new_cells])
             print new_line


if __name__ == '__main__':
    (options, args) = parser.parse_args()
    if not options.data_file:
        parser.print_usage()
        sys.exit(1)

    main(options.data_file, options.cell_sep, options.cell_col_sep)
于 2012-05-12T22:50:10.670 に答える