2014-11-04 2 views
-1

내가 PostgreSQL을에 SQL 쿼리에서 온이 값을 csv 파일로,목록을 CSV로 변환하려면 어떻게해야합니까?

**('80255', 'GRN', Decimal('4.00000000000000000000'))** 
('80425', 'GRN', Decimal('1.00000000000000000000')) 
**('80255', 'BCN', Decimal('1.00000000000000000000'))** 
('80425', 'BCN', Decimal('22.0000000000000000')) 
**('80255', 'PT', Decimal('2.0000000000000000'))** 
('80425', 'PT', Decimal('5.0000000000000000')) 
... 

내가 다음에 변환 할 (내가 firts 값이 동일하다는 것을 보여주기 위해 행의 색상을 변경) . (80425 등) 각 SKU, 나는 각 위치에서 재고를 넣어 원하는 (GRN/BCN/PT) 당신은 여러 값을 가진 키가있을 때

답변

1

좋은 도구를 사용하기 위해

80255;4;1;2 
80425;1;22;5 

collections.defaultdict defaultdict 컨테이너는 각각의 새 키에 대해 새 객체를 만들고 이미 존재하는 키를 만날 때 해당 키에서 작동합니다. 이 경우 작업은 목록 메서드 .append()입니다.

그리고 당신은 여기에 행 순서에 의존하지 않는 많은 의견을 가진 변종,의, @의 버니의 좋은 대답에서 계속 인용 csv 모듈

import csv, collections as co, decimal as dc, itertools as it 

fromdb = [('80255', 'GRN', dc.Decimal('4.00000000000000000000')) 
     ,('80425', 'GRN', dc.Decimal('1.00000000000000000000')) 
     ,('80255', 'BCN', dc.Decimal('1.00000000000000000000')) 
     ,('80425', 'BCN', dc.Decimal('22.0000000000000000')) 
     ,('80255', 'PT', dc.Decimal('2.0000000000000000')) 
     ,('80425', 'PT', dc.Decimal('5.0000000000000000'))] 

tocsv = co.defaultdict(list) 
for i in fromdb: 
    tocsv[i[0]].append(i[-1]) 

with open('output.txt','wb') as f: 
    cw = csv.writer(f,delimiter=';') 
    for k,v in tocsv.items(): 
     cw.writerow(tuple(it.chain((k,),v))) 
+0

+1 'GRN -> BCN -> PT' 행의 순서에 의존하는 것 같습니다. 그 질문은 여러분이 그렇게 할 수 있다고 말하지 않으며, 그렇다하더라도 어떤 숫자는'BCN' 행을 빠뜨릴 수 있습니다. – Andomar

+0

아, 네가 알아. 내 코드에는 데이터베이스의 결과를 정렬하는 것도없고 값이 누락되었는지 검사하는 것도 없습니다. – bernie

1

를 사용하여 파일에 기록 할 수 있으며, 그 수 누락 된 값 처리 :

# import collections and abbreviate it as co 
import collections as co 
import decimal as dc 
import csv 

fromdb = [('80255', 'GRN', dc.Decimal('4.00000000000000000000')) 
     ,('80425', 'GRN', dc.Decimal('1.00000000000000000000')) 
     ,('80255', 'BCN', dc.Decimal('1.00000000000000000000')) 
     ,('80425', 'BCN', dc.Decimal('22.0000000000000000')) 
     ,('80255', 'PT', dc.Decimal('2.0000000000000000')) 
     ,('80425', 'PT', dc.Decimal('5.0000000000000000'))] 

# Build a dictionary that maps values like '80255' 
# to a dictionary containing values for GRN, BCN and PT 
tocsv = co.defaultdict(lambda: 
    {'GRN': 0, 'BCN': 0, 'PT': 0}) 
for i in fromdb: 
    # Array index -1 refers to the last element 
    # For example, set tocsv['80255']['GRN'] to 4.00 
    tocsv[i[0]][i[1]] = i[-1] 

with open('output.txt','wb') as f: 
    cw = csv.writer(f,delimiter=';') 
    # items() returns an iterable of key (k) and value (v) pairs 
    # For key '80255', the value will be {'GRN': 4, 'BCN': 1, 'PT': 2} 
    for k,v in tocsv.items(): 
     # writerow() takes an array argument, hence the [] square brackets 
     cw.writerow([k, v['GRN'], v['BCN'], v['PT']]) 
+0

+1. 아주 잘 했어. – bernie

관련 문제