0

numpyモジュールなどに関するいくつかの関連記事を見てきました。csvモジュールを使用する必要があり、これで機能するはずです。ここではcsvモジュールの使用について多くのことが書かれていますが、探していた答えはまったく見つかりませんでした。よろしくお願いします

基本的に、私は次の関数/擬似コードを持っています(タブはうまくコピーされませんでした...):

import csv

def copy(inname, outname):
   infile = open(inname, "r")
   outfile = open(outname, "w")
   copying = False ##not copying yet

# if the first string up to the first whitespace in the "name" column of a row
# equals the first string up to the first whitespace in the "name" column of 
# the row directly below it AND the value in the "ID" column of the first row
# does NOT equal the value in the "ID" column of the second row, copy these two 
# rows in full to a new table.

たとえば、innameが次のようになっている場合:

ID,NAME,YEAR, SPORTS_ALMANAC,NOTES

(最初の1000行)

1001,New York Mets,1900,ESPN

1002,New York Yankees,1920,Guiness

1003,Boston Red Sox,1918,ESPN

1004,Washington Nationals,2010 

(最後の行までの最後の大量の行)

1231231231235,Detroit Tigers,1990,ESPN

次に、出力を次のようにします。

ID,NAME,YEAR,SPORTS_ALMANAC,NOTES

1001,New York Mets,1900,ESPN

1002,New York Yankees,1920,Guiness

文字列「New」は「Name」列の最初の空白まで同じ文字列であり、IDが異なるためです。明確にするために、「New」の正規表現は必要なものではないため、コードをできるだけ一般化できるようにする必要があります。これは、一般的な最初の文字列が実際には任意の文字列である可能性があるためです。そして、最初の空白の後に何が起こるかは問題ではありません(つまり、「ワシントンナショナルズ」と「ワシントンDC」は、上記のニューヨークの例のように、私にヒットを与えるはずです...)

Rには、特定の行の値で簡単に検索するためのinname $ nameという方法があるため、混乱しています。最初にRでスクリプトを書いてみましたが、混乱しました。だから私はPythonに固執したい。

4

1 に答える 1

2

これはあなたが望むことをしますか(Python 3)?

import csv 

def first_word(value):
    return value.split(" ", 1)[0]

with open(inname, "r") as infile:
    with open(outname, "w", newline="") as outfile:
        in_csv = csv.reader(infile)
        out_csv = csv.writer(outfile)

        column_names = next(in_csv)
        out_csv.writerow(column_names)

        id_index = column_names.index("ID")
        name_index = column_names.index("NAME")

        try:
            row_1 = next(in_csv)
            written_row = False

            for row_2 in in_csv:
                if first_word(row_1[name_index]) == first_word(row_2[name_index]) and row_1[id_index] != row_2[id_index]:
                    if not written_row:
                        out_csv.writerow(row_1)

                    out_csv.writerow(row_2)
                    written_row = True
                else:
                    written_row = False

                row_1 = row_2
        except StopIteration:
            # No data rows!
            pass

Python 2の場合、次を使用します。

with open(outname, "w") as outfile:
    in_csv = csv.reader(infile)
    out_csv = csv.writer(outfile, lineterminator="\n")
于 2012-08-10T19:04:00.190 に答える