2017-02-07 6 views
0

でCSV行に括弧が(存在する場合)、次のようにCSVファイルの内容は次のとおりです。どのように間にコンテンツを抽出しない、とPython

"Washington-Arlington-Al, DC-VA-MD-WV (MSAD)" 47894 1976 
"Grand-Forks, ND-MN"       24220 2006 
"Abilene, TX"         10180 1977 

必要な出力がCSV形式によって読み込まれ、見つけますDC-VA-MD-WV、ND-MN、TXおよび のみを取得してこの列を新しい列に挿入します。 (正規化用)

これまでのところ、多くの正規表現パターンをPythonで試しましたが、正しいパターンを得ることができませんでした。期待

sample=""" "Washington-Arlington-Al, DC-VA-MD-WV (MSAD)",47894,1976 
      "Grand-Forks, ND-MN",24220,2006 
      "Abilene, TX",10180,1977 """ 
open('sample.csv','w').write(sample) 
with open('sample.csv') as sample, open('output.csv','w') as output: 
    reader = csv.reader(sample) 
    writer = csv.writer(output) 
    for comsplit in row[0].split(','): 
     writer.writerow([ comsplit, row[1]]) 
    print open('output.csv').read() 

出力は次のとおりです。新しい行に

DC-VA-MD-WV 
ND-MN 
TX 

+0

分割するには正規表現パターンが必要ですか? (残念ながらかなり新しいPythonに) – Viv

答えて

1

正規表現はここで物事のカップルを提供し使用する必要はありません。

  1. 都市いつも私が受け入れるように修正を加えることができても、それは(空白の1つのスペースに続いての後にコンマを持っています(?)
  2. (MSAD)のようなものに遭遇する前に文字シーケンスの後に空白があります。

このコードは、サンプル入力に対するあなたの期待出力を提供します:

with open('sample.csv', 'r') as infile, open('expected_output.csv', 'wb') as outfile: 
    reader = csv.reader(infile) 
    expected_output = [] 
    for row in reader: 
     split_by_comma = row[0].split(',')[1] 
     split_by_space = split_by_comma.split(' ')[1] 
     print split_by_space 
     expected_output.append([split_by_space]) 

    writer = csv.writer(outfile) 
    writer.writerows(expected_output) 
1

私はこのようにそれを行うだろう:

with open('csv_file.csv', 'r') as f_in, open('output.csv', 'w') as f_out: 
    csv_reader = csv.reader(f_in, quotechar='"', delimiter=',', 
          quoting=csv.QUOTE_ALL, skipinitialspace=True) 
    csv_writer = csv.writer(f_out) 
    new_csv_list = [] 
    for row in csv_reader: 
     first_entry = row[0].strip('"') 
     relevant_info= first_entry.split(',')[1].split(' ')[0] 
     row += [relevant_info] 
     new_csv_list += [row] 
    for row in new_csv_list: 
     csv_writer.writerow(row) 

ご質問があれば私に教えてください。

+0

これは 'new_csv_list'に期待される出力を与えません。私はただそれをテストしました – roganjosh

+0

ええ、すみません、もう一度編集します。それはちょうどオプションがありません。 – Outis

+0

私は作業用コードの準備ができていますが、回答を投稿する前にこれを修正する機会を与えます。 – roganjosh

0

あなたが期待値を求めるために使用する権利regexを見つけるのトラブルを抱えているようです。

あなたの要件を満たす小サンプルpythextを作成しました。あなたが最初の列のすべての値の内容を確認するとき

基本的に、私はこれが役に立つことを願っ/(TX|ND-MN|DC-VA-MD-WV)/

のような正規表現を使用することができます!詳しい説明が必要な場合はお知らせください。

+0

これは非常に具体的な例では動作しますか?それはファイルの構造に基づいて適用することができる一般的なルールではなく、そのコンテンツ。 – roganjosh

+0

多分それは何か良いだろう'/ [AZ] {2} /'のようなものですが、これがまさにあなたが探しているものなのかわかりません – mabe02

+0

私はOPではありません:) – roganjosh

1

私はあなたがコンマと括弧の間の任意の英数字の式(ハイフン付きかどうか)を抽出します。この正規表現パターンを、使用することができます信じる:

import re 
BETWEEN_COMMA_PAR = re.compile(ur',\s+([\w-]+)\s+\(') 
test_str = 'Washington-Arlington-Al, DC-VA-MD-WV (MSAD)' 
result = BETWEEN_COMMA_PAR.search(test_str) 
if result != None: 
    print result.group(1) 

これが結果として出力されます:DC-VA-MD-WV、予想通り。

関連する問題