2016-04-15 13 views
1

フィールド/欄にカンマ(「、」)を持つCSVファイルがあります。このCSVをmongodbにロードしてデータを操作します。カンマの左側にテキストだけを残して、すべてのテキストをカンマから右に移動したいと思います。PythonでMongodbのフィールドからテキストを削除する

このタスクを実行する最も効率的な方法は何ですか?私のmongodb csvインポートスクリプト(私はパンダを利用しています)?その後、データが既にMongoDBに入っていますか?正直言って、私はプログラミングに慣れておらず、いずれのシナリオでもそれを行う方法を知りたいですが、私は最も効率的なソリューションを見たいと思います。ここで

は、Pythonのインポートスクリプトに私のcsvファイルです:ここで

#!/usr/bin/env python 
import sys 
import os 
import pandas as pd 
import pymongo 
import json 

def import_content(filepath): 
    mng_client = pymongo.MongoClient('localhost', 27017) 
    mng_db = mng_client['swx_inv'] 
    collection_name = 'device.switch' 
    db_cm = mng_db[collection_name] 
    cdir = os.path.dirname(__file__) 
    file_res = os.path.join(cdir, filepath) 

data = pd.read_csv(file_res, skiprows=2, skip_footer=1) 
data_json = json.loads(data.to_json(orient='records')) 
db_cm.remove() 
db_cm.insert(data_json) 

if __name__ == "__main__": 
    filepath = '/vagrant/data/DeviceInventory-Category.Switch.csv' 
    import_content(filepath) 

は、CSVの上位3行は、参考のためのものです。

Device,Serial Number,Realm,Vendor,Model,OS Image 
ABBNWX0100,SMG3453ESDN,BlAH BLAH,Cisco,WS-C6509-E,"IOS 12.2(33)SXI9, s72033_rp-ADVENTERPRISEK9_WAN-M" 
ABBNWX0101,SDG127343S0,BLAH BLAH,Cisco,WS-C4506-E,"IOS 12.2(53)SG8, cat4500-IPBASEK9-M" 
ABBNWX0102,TREFDSFY1KK,BLAH BLAH,Cisco,WS-C3560V2-48PS-S,"IOS 12.2(55)SE5, C3560-IPBASEK9-M" 

はEDIT:私はMongoDBのコレクションにアップロードする前にパンダを経由して必要なものを行うための方法を発見した私は、最後のフィールド、「OSイメージ」を変更しようとしています。

# Use pandas to read CSV, skipping top 2 lines & footer line from 
# CSV export. Set column data to string type. 
data = pd.read_csv(
    file_res, index_col=False, skiprows=2, 
    skip_footer=1, dtype={'Device': str, 'Serial Number': str, 
          'Realm': str, 'Vendor': str, 'Model': str, 
          'OS Image': str} 
) 
# Drop rows where Serial Number is empty 
data = data.dropna(subset=['Serial Number']) 

# Split the OS Image column by "," and ";" to remove extraneous data 
data['OS Image'].update(data['OS Image'].apply(
    lambda x: x.split(",")[0] if len(x.split()) > 1 else None) 
) 
data['OS Image'].update(data['OS Image'].apply(
    lambda x: x.split(";")[0] if len(x.split()) > 1 else None) 
) 

答えて

1
import csv 

s='''Device,Serial Number,Realm,Vendor,Model,OS Image 
ABBNWX0100,SMG3453ESDN,BlAH BLAH,Cisco,WS-C6509-E,"IOS 12.2(33)SXI9, s72033_rp-ADVENTERPRISEK9_WAN-M" 
ABBNWX0101,SDG127343S0,BLAH BLAH,Cisco,WS-C4506-E,"IOS 12.2(53)SG8, cat4500-IPBASEK9-M" 
ABBNWX0102,TREFDSFY1KK,BLAH BLAH,Cisco,WS-C3560V2-48PS-S,"IOS 12.2(55)SE5, C3560-IPBASEK9-M"''' 

print("\n".join([','.join(row[:5])+","+str(row[5].split(",")[0]) for row in csv.reader(s.split("\n"))])) 

より読みやすくするためにループにリストの内包の変換:

newtext="" 
for row in csv.reader(s.split("\n")): 
    newtext+=','.join(row[:5])+","+str(row[5].split(",")[0])+"\n" 
print(newtext) 

セーブ列のデータは、2つの異なる区切り文字を使用し、正規表現が正常に動作しないように私は、これを2回行う必要があります出力:

Device,Serial Number,Realm,Vendor,Model,OS Image 
ABBNWX0100,SMG3453ESDN,BlAH BLAH,Cisco,WS-C6509-E,IOS 12.2(33)SXI9 
ABBNWX0101,SDG127343S0,BLAH BLAH,Cisco,WS-C4506-E,IOS 12.2(53)SG8 
ABBNWX0102,TREFDSFY1KK,BLAH BLAH,Cisco,WS-C3560V2-48PS-S,IOS 12.2(55)SE5 

https://ideone.com/FMJCrO

ファイルの場合

あなたは、ファイル内の行のリストが含まれ、その後csv.reader(content)

+0

ありがとうritesht93を使用します

with open(fname) as f: content = f.readlines() 

contentを使用する必要があります。大きな助け。私はmongodbの既存のエントリを更新する方法を見つけたいと思いますが、私はこれをインポートスクリプトで処理しており、更新のための青写真として使うことができます。 – TobyMcCann

関連する問題