2012-10-16 74 views
-3

我有一個大的CSV文件(數百行)包含以下結構:
文件名,站點名稱,服務器名稱遍歷大CSV蟒蛇

這個CSV文件包含幾個雙打,因爲servernames節點是那些來自羣集(總是相同的夫婦)和語言別名爲sitenames(例如,mijnhuis,myhouse,mamaison)

我想要的結果是以下內容(請注意;以及:,
文件名; sitename1,sitename2,sitename3; servername1,servername2,s ervername3;

我怎麼能以最優化的方式做到這一點? PS:實際的代碼會很好,但如果你能給我指示,我會同樣高興。

+0

[?你嘗試過什麼(http://mattgemmell.com/2008/12/08/what-have-you-tried /) –

+1

「大csv文件(幾百行)」 - 不完全大,所以我不會想到在這個階段任何優化是必要的 –

+2

哇:只是因爲我沒有發佈任何意味着我沒有' t試過... – ShadowFlame

回答

1

使用的網站名稱和servernames節點的字典文件名和2列出了每個字典項

2

你的數據結構取決於你的程序。也許你還可以存儲 文件名的字典元組(sitename1, servname2)有噸的方式列表來完成你是什麼tryign做

你可以這樣做:

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可能是非常有用的。在您自己的風險

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])) 
+0

它更簡單,並且通常期望使用從集合導入defaultdict' –

+0

@Jon ...這是一種習慣:)我通常不是來自x import y的巨大粉絲。我想立即看到某件東西被導入。雖然在這樣的情況下,我會同意這有點矯枉過正。 –

0

,因爲它恰巧,包括在這裏,我的問題的解決方案。包括exampleFile。

CODE:

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