0

私は正規表現と戦っていますが、それを理解できません。

last.fm (www.lastfm.com) から抽出した入札データベースがあります。このファイルは、各行の各列が「,」(コンマ) で区切られた .txt ファイルで、1.7 GB を超えており、R への読み取りを台無しにする文字がいくつかあります。主な問題は、他の引用符内の " (引用符) にあります。

説明するために、readLines が適用されたときの .txt ファイルの例を次に示します。

[1] "user,\"Method Man & Redman\",\"Da Rockwilder\",0,2012,2,10,8,0,41"       
[2] "user,\"Method Man & Redman\",\"Y.O.U.\",0,2012,2,10,7,56,25"             
[3] "user,\"Method Man & Redman\",\"Blackout\",0,2012,2,10,7,51,53"           
[4] "user,\"Chuckie\",\"Who Is Ready To Jump (Club Mix)\",0,2012,2,10,7,40,12"
[5] "user,\"Opgezwolle\",\"Volle Kracht\",0,2012,2,10,7,36,31"                
[6] "user,\"Opgezwolle\",\"Ut Is Wat Het Is\",0,2012,2,10,7,33,25"

基本的に、これは10列のデータフレームになります:ユーザー名、「アーティスト」、「トラック」、愛された(0/1)、年、月、日、時、分、秒

上記の例は問題なく簡単に読むことができますが、次のようなことが起こると問題が発生します。

[1] "user,\"Fall Out Boy\",\"\"The Take Over, The Breaks Over\"\",0,2010,4,17,7,11,37"
[2] "user,\"Gare du Nord\",\"I Want Love 12\" Remix\",0,2011,6,12,19,32,33"

最初のケースでは、二重引用符が原因で、トラック名のコンマによってこれが 2 つの異なる列になり、10 列ではなく 11 列になります。2 番目のケースでは、12" は文字列を「開いた」ままにし、同様のケースが見つかるまで停止します。これが発生すると、データ フレームのいくつかの行が失われます。

解決策として何が欲しいですか?アーティストの名前とトラックの名前を囲むものを除いて、すべての " (引用符) を削除したいと思います。

出力: 出力には、各行に合計 4 つの " (引用符) があります。"アーティスト" と "トラック名" です。したがって、問題を引き起こす 2 行の出力は次のようになります。

[1] "user,\"Fall Out Boy\",\"The Take Over, The Breaks Over\",0,2010,4,17,7,11,37"
[2] "user,\"Gare du Nord\",\"I Want Love 12 Remix\",0,2011,6,12,19,32,33"

gsub と gstring で Regex を使用しようとしましたが、余分な " マークだけを抽出することはできません。

これが複雑すぎる場合は、最初の 3 つ (アーティスト名を囲む引用符とトラック名を囲む最初の引用符) と最後の 3 つ (トラック名の最後の引用符) を除くすべての " を抽出する何かが、ほとんどの場合に機能する可能性があります。 (残りは手動で行います) ここでは、アーティスト名に引用符が含まれていないと仮定しています。

さらに詳しい説明やデータが必要な場合はお知らせください。

4

2 に答える 2

2

英数字と二重引用符と後方参照を持つ文字クラスはそれを行うことができます:

gsub("([ 0-9a-zA-Z\"])(\\\")([ 0-9a-zA-Z\"])", "\\1\\3",test)

[1] "user,\"Fall Out Boy\",\"The Take Over, The Breaks Over\",0,2010,4,17,7,11,37"
[2] "user,\"Gare du Nord\",\"I Want Love 12 Remix\",0,2011,6,12,19,32,33"     

次のことも検討できます。

gsub("([ [:alpha:][:digit:]\"])(\\\")([ [:alpha:][:digit:]\"\"])", 
     "\\1\\3", test)

基本的に、コンマを含まないクラスが両側にある二重引用符を削除します。引用符と正しい区切り記号の間にスペースがあると、うまくいきません。?regex ページでは、文字クラスを使用するためのオプションについて説明しています。括弧は後方参照の区切り文字です。最初の後方参照は'\\1'、最初の対の括弧内の文字クラスに一致する文字を参照します: ([ [:alpha:][:digit:]\"]). 置換引数から中央の後方参照を省略すると、一致する二重引用符が削除されます。

于 2014-10-29T23:53:36.833 に答える