1

Ruby を使用して csv ファイルから特定のデータを抽出しています。不要な文字を削除して、抽出された文字列をクリーンアップしたいと考えています。

これまでのところ、データを抽出する方法は次のとおりです。

CSV.foreach(data_file, :encoding => 'windows-1251:utf-8', :headers => true) do |row|

    #create an array for each page
    page_data = []
    #For each page, get the data we are interested in and save it to the page_data
    page_data.push(row['dID'])
    page_data.push(row['xTerm'])

    pages_to_import.push(page_data)

次に、抽出したデータを含むcsvファイルを出力します

抽出された出力は、csv データ ファイルとまったく同じです。

| ID    |  Term                                   |
|-------|-----------------------------------------|
| 13241 |  @@106#107#my@@106#term@@           |
| 13345 |  @@63#hello@@                           |
| 11436 |  @@55#rock@@20#my@@10015#18#world@@ |

ただし、達成したい私の望ましい結果は次のとおりです。

| ID    |  Term                                   |
|-------|-----------------------------------------|
| 13241 |  my, term                               |
| 13345 |  hello                                  |
| 11436 |  rock, my, world                        |

これを達成する方法について何か提案はありますか?

私が使用しているライブラリ:

require 'nokogiri'
require 'cgi'
require 'csv'
4

2 に答える 2

1

正規表現を使用すると、次のようになります。

%w[
  @@106#107#term1@@106#term2@@
  @@63#term1@@
  @@55#term1@@20#term2@@10015#18#term3@@
  @@106#107#my@@106#term@@
  @@63#hello@@
  @@55#rock@@20#my@@10015#18#world@@
].map{ |str|
  str.scan(/[^@#]+?)(?=@/)
}
# => [["term1", "term2"], ["term1"], ["term1", "term2", "term3"], ["my", "term"], ["hello"], ["rock", "my", "world"]]

Mystrは your の内容と同等ですrow['xTerm']

正規表現は、 orを含まず、で終わる/[^@#]+?(?=@)/パターンを検索します。str#@@

文字列のガベージと、Nokogiri と CSV を使用しているというコメントから、入力データを CSV または HTML として表示しなかったため、受信データを何らかの方法で処理していないかどうか疑問に思う必要があります。後処理で小刻みに動かそうとしています。もしそうなら、あなたが実際に何をしているのかを見せてください。私たちはあなたがきれいなデータを手に入れるのを手伝うことができるかもしれません.

于 2013-10-30T15:31:19.553 に答える
0

あなたの用語は で区切られ@@ており、1 つ以上の数字と で区切られた実際の用語で構成されていると想定しています#。項を配列に取得するには:

row['xTerm'].split('@@')[1..-1].map { |term| term.split(?#)[-1] }

次にjoin、それを使って好きなことをすることができます。

于 2013-10-30T15:15:34.477 に答える