-3

次の構造を含む大きなcsvファイル(数百行)があります:
ファイル名、サイト名、サーバー名

この csv ファイルには、サーバー名がクラスター (常に同じカップル) からのものであり、サイト名の言語エイリアス (例: mijnhuis、myhouse、mamaison) であるため、複数の double が含まれています。

私が望む結果は次のとおりです( ; と , :
filename; sitename1, sitename2, sitename3; servername1, servername2, servername3; に注意してください。

最も最適化された方法でこれを行うにはどうすればよいですか?

PS: 実際のコードでもいいのですが、指示をいただければ幸いです。

4

4 に答える 4

3

自己責任:

import collections as c

f = open('input', 'r')
sites, servers = c.defaultdict(set), c.defaultdict(set)
files = set()
for line in f:
    parts = line.split(',')
    fi,site,server = [p.strip() for p in parts]
    files.add(fi)
    sites[fi].add(site)
    servers[fi].add(server)

for f in files:
    print "%s; %s; %s" % (f, ", ".join(sites[f]), ", ".join(servers[f]))
于 2012-10-16T17:08:35.747 に答える
2

データ構造はプログラムによって異なります。おそらく、ファイル名の辞書をタプルのリストに保存することもでき(sitename1, servname2) ます。あなたがやろうとしていることを達成する方法はたくさんあります

次のようなことができます。

import csv

file_names_to_data = {}

with open('your_csv') as f:
   reader = csv.reader(f)
   for line_list in reader:
      try:      
        file_names_to_data[line_list[0]]['sitenames'].append(line_list[1])
        file_names_to_data[line_list[0]]['servernames'].append(line_list[2])
      except KeyError:
        # initialize it
        file_names_to_data[line_list[0]] = {'sitenames': [line_list[1]], 'servernames': [line_list[2]]}

さらに、 defaultdictは非常に便利なようです。

于 2012-10-16T17:06:53.237 に答える
1

ファイル名に辞書を使用し、辞書項目ごとにサイト名とサーバー名の 2 つのリストを使用します。

于 2012-10-16T17:00:55.503 に答える
0

たまたま、ここに含まれているのは、私の問題の解決策です。exampleファイルが含まれています。

コード:

fp = r'PATH_TO_FILE'

aliases = []
aliases.append(("sitex","sitez","sitey"))


splitFile = []
for l in open(fp):
    parts = tuple(l[:-1].replace(" ","").split(","))
    splitFile.append(parts)

def isAlias(old, new):
    print old, new
    aliasFound = False
    for alias in aliases:
        if old in alias and new in alias:
            aliasFound = True

    return aliasFound

handledSites = []
for split in splitFile:
    log = split[0]
    site = split[1]
    rp = split[2]


    matchFound = False
    for hs in handledSites:
        if site in hs[0]:
            matchFound = True
            if rp not in hs[1]:
                hs[1].append(rp)
            if log not in hs[2]:
                hs[2].append(log)
        if not matchFound:
            if isAlias(hs[0][0], site):
                matchFound = True
                hs[0].append(site)
                if rp not in hs[1]:
                    hs[1].append(rp)
                if log not in hs[2]:
                    hs[2].append(log)
    if not matchFound:
        handledSites.append(([site],[rp],[log]))

for s in handledSites:
    print s

サンプルファイル

logfile[date]_[server]_sitex.log, sitex, rp1
logfile[date]_[server]_sitex.log, sitex, rp2
logfile[date]_[server]_sitey.log, sitey, rp1
logfile[date]_[server]_sitey.log, sitey, rp2
logfile[date]_[server]_sitez.log, sitez, rp1
logfile[date]_[server]_sitez.log, sitez, rp2
logfile[date]_[server]_site3.log, site3, rp1
logfile[date]_[server]_site3.log, site3, rp2
于 2012-10-16T18:50:01.713 に答える