2017-12-21 11 views
-2

アムは、この例のような多くの不正な形式の電子メールアドレスを、持っているCSVファイルをクリーンアップしようとしている必要:種類は

2つのアドレスを示しているが、別々の姓と名を持つ
"Scarpaci" 
"Joseph" <[email protected]>" 
"Adams" 
"Robert" <[email protected]>" 

ライン。 1)複数行アドレスを認識し、2)名前、姓、電子メールアドレスを1行に置き換えますが、最初と最後を二重引用符で囲んだ正規表現が必要です。 Mac OSの、持っているものは何でも正規表現エンジンを使用して

アム...

+3

そして、あなたの試みは何、これまでのように見えますか? (これは無料の「コードオンデマンド」サービスではありません) –

+0

2ステップで実行します。 '?(?<=>)"(?= \ r?\ n ")'は何も置き換えないで、 '(?)" \ r?\ n "をスペースで置き換えてください。 – sln

+1

申し訳ありませんが、私はどこで複数の行に正規表現を使用して開始するか分からなかった...しかし、以下の答えは、少しperlを使用して、エレガントなソリューションを提供した。 – rixter

答えて

1

Perlはこのために良いです。 (改行です)デフォルトの代わりに、レコードの終わりに一致するものにレコードセパレータを設定します。

local $/ = '>"'; 

は、その後、あなただけの、通常通り「行ごと」でそれを読んで、それをクリーンアップすることができますそうですね。

/\"([^\"]+)\".+? # first name 
    \"([^\"]+)\"\s+ # second name 
    <(.+)>\"* # email 
/xs or next; 

あなたの出力をキャプチャグループと"$1 $2" $3のようなもの、次のようになります。このような何かは改行がOKであり、それを文書化するコメントのxので、Perlのs修飾子を使用して、ループに役立つはずです。

これはMacOSでうまく動作します。

#!/usr/bin/perl -l 

local $/ = '>"'; 

while (<>) { 
    /\"([^\"]+)\".+? # first name 
    \"([^\"]+)\"\s+ # second name 
    <(.+)>\"* # email 
    /xs or next; 

    print qq["$1 $2" $3]; 
} 

非毛深い出力:

$ perl that-script.pl < that-data.txt 
"Scarpaci Joseph" [email protected] 
"Adams Robert" [email protected] 
$ 
+1

驚くばかりの答え!魅力のように働き、便利なperlを学びました... – rixter