2016-08-24 4 views
2

このプロセスを自動化する方法があるかどうかを探しています。基本的には、毎日30万行のデータをダウンロードする必要があります。 SQLにアップロードする前に編集する必要がある行がいくつかあります。テキストファイルを検索して編集する

Jordan || Michael | 23 | Bulls | Chicago 

Bryant | Kobe ||| 8 || LA 

私が達成したいのは、1行に4つの垂直バーがあることです。通常は、キーワードを検索して手動で編集して保存します。この2つは私のデータの唯一の異常です。

  1. "Jordan"を検索して、余分な1垂直バー "|"を削除します。それの直後。
  2. "神戸"を見つけて、余分な2つの垂直バー "|"を取り除く必要があります。それの直後。

正しい形式は以下の通りです - これはVBScriptやPythonで行うことができる場合

Jordan | Michael | 23 | Bulls | Chicago 

Bryant | Kobe | 8 || LA 

わかりません。 ご協力いただければ幸いです。ありがとう!

+0

なぜ8の後に2つの '| 'がありますか? –

+0

こんにちは。上記の例では、各フィールドを区切る行ごとに4つの垂直バーが常に存在する必要があります。上記の例のように、フィールドが空白になる場合があります。 –

答えて

2

Pythonまたはvbscriptを使用することもできますが、これは何かのために残酷です。 sedをお試しください:

$ sed -E 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file 
Jordan | Michael | 23 | Bulls | Chicago 
Bryant | Kobe | 8 || LA 

新しいファイルに保存するには:

sed -E 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file >newfile 

あるいは、その場で既存のファイルを変更するには:

それは

sedの仕組み

sed -Ei.bak 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file 

ファイルを1行ずつ読み込んで処理します。ここでは、s/old/new/gという形式の置換コマンドのみが必要です。ここで、oldは正規表現であり、見つかった場合はnewに置き換えられます。コマンドの末尾にあるオプションのgは、sedに 'グローバルに'置換コマンドを実行するように指示します。これは、一度だけでなく行に表示されている回数だけ繰り返すことを意味します。ヨルダンを探すためにsedを

  • s/(Jordan *)\|/\1/g

    これは告げるには、ゼロ以上のスペース縦棒が続くと垂直バーを削除しました。

    より具体的には、(Jordan *)の括弧は、文字列「Jordan」に続けて0個以上のスペースをグループとして保存するようにsedに指示します。置換側では、そのグループを\1と参照します。

  • s/(Kobe *)\| *\|/\1/g

    同様に、これは、垂直バーに続くゼロ以上のスペースが続き、神戸を探して、垂直バーを削除するsedを伝えます。

    上記と同じロジックを使ってPython

を使用して

、ここでのpythonプログラムは次のとおりです。

$ cat kobe.py 
import re 
with open('file') as f: 
    for line in f: 
     line = re.sub(r'(Jordan *)\|', r'\1', line) 
     line = re.sub(r'(Kobe *)\| *\|', r'\1', line) 
     print(line.rstrip('\n')) 
$ python kobe.py 
Jordan | Michael | 23 | Bulls | Chicago 
Bryant | Kobe | 8 || LA 

新しいファイルにそれを保存するには:

python kobe.py >newfile 

+0

こんにちは、うわー!ちょうど2行のコード。私はsedに慣れていない、それは私がWindowsで実行することができますか?ありがとう! –

+0

@JamesVici Windowsに 'sed'をインストールするには様々な方法があります。 Cygwin、GNUWin32、およびmsysパッケージの一部であることはわかっています。あるいは、Pythonコードで答えを更新しました。 – John1024

+0

あなたは名前でキーイングしています。彼は300,000行の名前があることを覚えています。 –

1

私が書きましたPython 3.5のコードスニペットを次に示します。

# -*- coding: utf-8 -*- 

rows = ["Jordan||Michael|23|Bulls|Chicago", 
     "Bryant|Kobe|||8||LA"] 

keywords = ["Jordan", "Kobe"]   

def get_keyword(row, keywords): 
    for word in keywords: 
     if word in row: 
      return word 
    else: 
     return None    

for line in rows: 
    num_bars = line.count('|') 
    num_bars_del = num_bars - 4 # Number of bars to be deleted 
    kw = get_keyword(line, keywords) 
    if kw: # this line contains a keyword 
     # Split the line by the keyword 
     first, second = line.split(kw) 
     second = second.lstrip() 
     result = "%s%s%s"%(first, kw, second[num_bars_del:]) 
     print(result) 
関連する問題