清理从csv文件中提取的字符串

时间:2013-10-30 15:09:58

标签: python ruby csv export-to-csv

我使用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'

2 个答案:

答案 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或随心所欲地做任何事情。