我使用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'
答案 0 :(得分: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
中不包含#
或@
并以@
结尾的模式。
来自字符串中的垃圾,以及您正在使用Nokogiri和CSV的评论,以及因为您没有将输入数据显示为CSV或HTML,我不得不怀疑您是否未对输入的数据进行修改不知何故,并试图在后处理中摆脱它。如果是这样,请告诉我们您实际在做什么,也许我们可以帮助您获得干净的数据。
答案 1 :(得分:0)
我假设您的字词已被预订并由@@
分隔,并且由一个或多个数字组成,后跟由#
分隔的实际字词。要将术语放入数组中:
row['xTerm'].split('@@')[1..-1].map { |term| term.split(?#)[-1] }
然后你可以join
或随心所欲地做任何事情。