2012-06-14 2 views
2

에서 같은 1 열 값이 CSV 파일의 모든 행 나는 이런 식으로 뭔가가는 CSV 파일이 가입 :파이썬

[ '이름 1', '', '', ''를, '', '', '' '' '' '' '' '' '' '' '' '' '' '' '' '', '', '', '', '', '', [ 'Name2', '', '', '', '', '', '', '', '' '' '' '' '' '', '', '', 'a', '']
[ 'Name3', '', '' '' '' '' '' '' '', '', '', '' '' '' '' '' '' '' '' '' '' ' ',' ' '']

지금, 내가 예를 들어, 하나 개의 컬럼에 같은 1 열 이름이 모든 행에 가입하는 방법이 필요합니다 :

[ '이름 1', '' , '', '', '', '', '', '', '', '', '' '' '', '', '+']
[ 'Name2', '', '', '', '', '', '', '', '', '', '', '' '']
[ 'Name3', '', '', '', '', '+', '', '' '' '' '' ' '', '', '', '', '', '', '']

CSV를 정렬 한 다음 각 행과 열로 이동하고 각 값을 비교하여이 작업을 수행하는 방법을 생각할 수 있지만 그 방법은 쉬울 것입니다.

아이디어가 있으십니까? 이 사전의 각 키의 이름과 해당 값이 해당 행입니다

+0

에 가입하여 열을. – eumiro

+0

당신은 아마도 _join_가 무엇을해야하는지 더 명확히해야합니다. – moooeeeep

+0

같은 열을 첫 번째 값이 같은 두 행에 표시 할 수 있습니까? 이 경우에 당신은 무엇을하고 싶습니까? –

답변

3

당신은 itertools.groupby을 사용해야합니다

t = [ 
['Name1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+'], 
['Name1', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', ''], 
['Name2', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', ''], 
['Name3', '', '', '', '', '+', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
] 

from itertools import groupby 

# TODO: if you need to speed things up you can use operator.itemgetter 
# for both sorting and grouping 
for name, rows in groupby(sorted(t), lambda x:x[0]): 
    print join_rows(rows) 

그것은 당신이 별도의 함수의 병합을 구현 줄 것이 분명합니다. 이 같은 예를 들어

def join_rows(rows): 
    def join_tuple(tup): 
     for x in tup: 
      if x: 
       return x 
     else: 
      return '' 
    return [join_tuple(x) for x in zip(*rows)] 
+3

't'는 이것이 작동하기 위해서는 이름순으로 정렬되어야합니다. –

+0

@SimeonVisser는 그 메모를 보내 주셔서 감사합니다! – moooeeeep

+0

작동하지 않습니다. join_rows는 일부 lib의 함수이거나 코드와 별도로 작성해야하는 항목입니까? – jbssm

1
def merge_rows(row1, row2): 
    # merge two rows with the same name 
    merged_row = ... 
    return merged_row 

r1 = ['Name1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+'] 
r2 = ['Name1', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
r3 = ['Name2', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', ''] 
r4 = ['Name3', '', '', '', '', '+', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
rows = [r1, r2, r3, r4] 
data = {} 
for row in rows: 
    name = row[0] 
    if name in data: 
     data[name] = merge_rows(row, data[name]) 
    else: 
     data[name] = row 

는 이제 data의 모든 행이있다. 이제이 데이터를 CSV 파일에 쓸 수 있습니다.

+0

안녕하세요. 감사합니다. Simeon : merged_row 부분에서 무슨 일이 일어나고 있는지 이해할 수 없습니다. 같은 이름의 이전 행이 병합 될 수 있도록 어디에 저장되어 있습니까? – jbssm

+0

현재 처리중인 행은'row'이고 다른 행은'data [name]'입니다. 'data [name]'의 행은 그 이름을 가진 이전 행이거나 그 이름을 가진 행들의 하나 이상의 병합 결과입니다.따라서 두 행을 같은 이름으로 병합하는 방법을 지정하는 코드 만 작성하면됩니다. 'merged_row '에 해당 코드를 작성하면 (같은 이름의 행이 세 개 이상 있더라도) 행을 반복적으로 병합합니다. –

+0

약간 지워지도록 코드를 업데이트했습니다. 같은 이름의 두 행을 병합하는 방법을 지정하려면'merge_rows '를 작성하면됩니다. –

0

또한 defaultdict를 사용할 수 있습니다

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> _ = [d[i[0]].append(z) for i in t for z in i[1:]] 
>>> d['Name1'] 
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 

을 그런 일을 가장 논리적 인 방법 같은 소리