2012-12-05 3 views
3

안녕하세요 저는 공통 열 또는 기본 키를 기반으로 두 CSV 파일에서 특정 필드의 병합에서 새 CSV 파일을 만들려고합니다. 나는 powershell에서 똑같은 일을 시도했으나 효과가 있었지만 프로세스를 완료하는 데는 매우 느 렸습니다. 5000 개 이상의 라인 파일을 병합하는 데 30 분 이상 걸렸으므로 파이썬에서이 작업을 시도했습니다. 나는 새로운이에요. 제발 쉽게가주세요.Python 사전을 사용하여 파이썬에서 CSV 파일 병합

그래서 두 파일은 infile.csv 및 checkfile.csv이고 생성 된 출력 파일의 열은 infile.csv의 열을 기반으로합니다. 이 코드는 checkfile.csv의 값을 검사하고 outfile.csv를 만들고 infile.csv의 열을 복사하며 checkfile.com의 해당 값을 기반으로 두 필드의 값을 다시 작성해야합니다. 세부

은 다음과

infile.csv -

"StockNumber","SKU","ChannelProfileID","CostPrice" 
"10m_s-vid#APTIIAMZ","2VV-10",3746,0.33 
"10m_s-vid#CSE","2VV-10",3746,0.98 
"1RR-01#CSE","1RR-01",3746 
"1RR-01#PCAWS","1RR-01",3746, 
"1m_s-vid_ext#APTIIAMZ","2VV-101",3746,0.42 

checkfile.csv

ProductCode, Description, Supplier, CostPrice, RRPPrice, Stock, Manufacturer, SupplierProductCode, ManuCode, LeadTime 
2VV-03,3MTR BLACK SVHS M - M GOLD CABLE - B/Q 100,Cables Direct Ltd,0.43,,930,CDL,2VV-03,2VV-03,1 
2VV-05,5MTR BLACK SVHS M - M GOLD CABLE - B/Q 100,Cables Direct Ltd,0.54,,1935,CDL,2VV-05,2VV-05,1 
2VV-10,10MTR BLACK SVHS M - M GOLD CABLE - B/Q 50,Cables Direct Ltd,0.86,,1991,CDL,2VV-10,2VV-10,1 

내가 점점 오전 outfile.csv입니다 -

StockNumber,SKU,ChannelProfileID,CostPrice 
10m_s-vid#APTIIAMZ,2VV-10,"(' ',)", 
10m_s-vid#CSE,2VV-10,"(' ',)", 
1RR-01#CSE,1RR-01,"(' ',)", 
1RR-01#PCAWS,1RR-01,"(' ',)", 
1m_s-vid_ext#APTIIAMZ,2VV-101,"(' ',)", 

그러나 outfile.csv 필요합니다. -

StockNumber,SKU,ChannelProfileID,CostPrice 
10m_s-vid#APTIIAMZ,2VV-10,1991,0.86 
10m_s-vid#CSE,2VV-10,1991,0.86 
1RR-01#CSE,1RR-01 
1RR-01#PCAWS,1RR-01   
1m_s-vid_ext#APTIIAMZ,2VV-101 

마지막 코드 -

import csv 

with open('checkfile.csv', 'rb') as checkfile: 
    checkreader = csv.DictReader(checkfile) 

    product_result = dict(
     ((v['ProductCode'], v[' Stock']), (v['ProductCode'], v[' CostPrice'])) for v in checkreader 
    ) 

with open('infile.csv', 'rb') as infile: 
    with open('outfile.csv', 'wb') as outfile: 
     reader = csv.DictReader(infile) 

     writer = csv.DictWriter(outfile, reader.fieldnames) 
     writer.writeheader() 

     for item in reader: 
      result = product_result.get(item['SKU'], " ") 

      item['ChannelProfileID'] = result, 
      item['CostPrice'] = result 

      writer.writerow(item) 
+0

문제가 무엇인지 확실하지 않습니다. 또한 원하는 결과가 어떤 모양인지 분명하지 않습니다. – pillmuncher

+0

또한 infile 헤더는 4 개의 필드를 정의하지만 그 아래에는 3 개가 있습니다. – pillmuncher

+0

지금은 예상 outfile.csv를 추가했습니다. 보시다시피 ChannelProfileID 및 CostPrice 항목은 채워 져야하지만 그렇지 않습니다. – Anike

답변

3

당신은 조금 간단하게 만들 수 :

import csv 

with open('checkfile.csv', 'rb') as checkfile: 
    product_result = { 
     record['ProductCode']: record for record in csv.DictReader(checkfile)} 

with open('infile.csv', 'rb') as infile: 
    with open('outfile.csv', 'wb') as outfile: 
     reader = csv.DictReader(infile) 
     writer = csv.DictWriter(outfile, reader.fieldnames) 
     writer.writeheader() 
     for item in reader: 
      record = product_result.get(item['SKU'], None) 
      if record: 
       item['ChannelProfileID'] = record[' Stock'] # ??? 
       item['CostPrice'] = record[' CostPrice'] 
      else: 
       item['ChannelProfileID'] = None 
       item['CostPrice'] = None 
      writer.writerow(item) 

은 내가 ???와 주석 라인에 대한 확신하지 못했습니다.

또한 정말로 깨진 CSV를 제작하려면 else 절을 ​​생략하십시오.

StringIO 객체로 테스트했습니다. 지정한 결과를 생성했지만, 쉼표가있는 경우에는 checkfile에 일치하는 것이 없습니다.

그리고 파이썬 2.7의 사전 이해를 사용했습니다. 질문을 파이썬 -2.7으로 태그를 지정했기 때문입니다.

+0

고마워요! 내가 +1 할 수있는 충분한 점수를 얻으면! – Anike

1
import csv 

product_result = {} 

with open('checkfile.csv', 'rb') as checkfile: 
    checkreader = csv.DictReader(checkfile) 

    for v in checkreader: 
     product_result[v['ProductCode']] = (v[' Stock'], v[' CostPrice']) 

with open('infile.csv', 'rb') as infile: 
    with open('outfile.csv', 'wb') as outfile: 
     reader = csv.DictReader(infile) 
     writer = csv.DictWriter(outfile, reader.fieldnames) 
     writer.writeheader() 

     for item in reader: 
      result = product_result.get(item['SKU']) 
      if result: 
       item['ChannelProfileID'], item['CostPrice'] = result 
      else: 
       item['ChannelProfileID'] = item['CostPrice'] = None 

      writer.writerow(item) 
+0

답장을 보내 주셔서 감사합니다 .- 그래서 나는 infile 데이터를 튜플에 넣습니다. 그러나 'Stock'필드에 대한 사전 값을 ChannelProfileID로 업데이트하고 outfile.csv에서 'CostPrice'값을 CostPrice로 업데이트하는 방법은 무엇입니까? – Anike

+0

계속 하시겠습니까? [ 'ChannelProfileID'] = result [ 'Stock'] 기본적으로 사전에서 특정 CSV 필드로 데이터를 쓰려고합니다. – Anike

+0

결과는 터플이므로 해당 인덱스에만 정수를 사용할 수 있습니다. 이 인스턴스에서 내가 한 것은 시퀀스 압축 풀기입니다. 덕분에 – Talvalin

관련 문제