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"]]

str的内容相当于你的row['xTerm'].

正则表达式/[^@#]+?(?=@)/搜索str不包含#or@且以 . 结尾的模式@

从字符串中的垃圾,以及您使用 Nokogiri 和 CSV 的评论,并且由于您没有将输入数据显示为 CSV 或 HTML,我不得不怀疑您是否没有以某种方式破坏传入的数据,并且试图在后期处理中摆脱它。如果是这样,请向我们展示您实际在做什么,也许我们可以帮助您开始获得干净的数据。

于 2013-10-30T15:31:19.553 回答
0

我假设您的条款是@@#. 要将术语放入数组中:

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

然后你可以join或做任何你想做的事。

于 2013-10-30T15:15:34.477 回答