为什么我的ruby脚本没有拆分CSV中的字段?

时间:2013-12-27 20:37:00

标签: ruby string csv split

以下是我的CSV状态:http://tinypic.com/r/kuwk6/5

这是我的代码:

File.open("/Users/Katie/Downloads/File_Name.csv", encoding: "ISO-8859-1").each_line do |line|

  line.chomp!
  CSV.parse(line, col_sep: "\t") do |row|
    unless row[4].nil?
      puts row[4].split("&Wt.srch=1")[0]
    end
  end
end

我遇到了特殊字符的问题,这就是我在那里编码的原因,因为我在Mac上,当我在Excel中打开一个CSV时,它对行做了一些奇怪的事情,所以我放入了行.chomp!该文件在技术上是制表符分隔,因此我为选项卡执行了col_sep。

基本上我希望将URL拆分为“& Wt.srch = 1”,但我只希望在拆分后返回字符串的第一部分,这就是我放置[0]的原因。

当我运行没有“除非”行的代码时,它表示block (2 levels) in <main>': undefined method分裂为nil:NilClass(NoMethodError)

这让我觉得它认为这个专栏是空的,实际上并非如此。但是,当我放入“除非”行时,它运行脚本就好了,但实际上并没有拆分url字符串。

很抱歉,如果这是一个非常基本/简单的问题...请提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您不需要CSV.parse这样做

使用标签:

文件:

c1  c2  c3  c4  c5
Hello   Alpha   Example More    https://www.exampl.com?f1=1&Wt.srch=1&utm=2&utm2=blah
Thanks  Bravo   Example some    https://www.exampl.com?f1=1&Wt.srch=1&utm=2&utm2=blah
Blah    Charlie Example stuff   https://www.exampl.com?f1=1&Wt.srch=1&utm=2&utm2=blah    

脚本:

 #returns each_line of the csv file as a string
File.open("/Users/Katie/Downloads/File_Name.csv").each_line do |line|
  #splits the line at tab character into row Array
  row = line.chomp.split("\t")      
  unless row[4].nil?
    puts row[4].split("&Wt.srch=1")[0]
  end
end

输出:

c5
https://www.exampl.com?f1=1&
https://www.exampl.com?f1=1&
https://www.exampl.com?f1=1&

使用逗号:

文件:

c1,c2,c3,c4,c5
Hello,Alpha,Example,More,https://www.exampl.com?f1=1&Wt.srch=1&utm=2&utm2=blah
Thanks,Bravo,Example,some,https://www.exampl.com?f1=1&Wt.srch=1&utm=2&utm2=blah
Blah,Charlie,Example,stuff,https://www.exampl.com?f1=1&Wt.srch=1&utm=2&utm2=blah

脚本:

 #returns each_line of the csv file as a string
File.open("/Users/Katie/Downloads/File_Name.csv").each_line do |line|
  #splits the line at tab character into row Array
  row = line.chomp.split(",")      
  unless row[4].nil?
    puts row[4].split("&Wt.srch=1")[0]
  end
end

输出:

c5
https://www.exampl.com?f1=1&
https://www.exampl.com?f1=1&
https://www.exampl.com?f1=1&

使用“ISO-8859-1”处理编码使用的脚本:

File.open("/Users/Katie/Downloads/File_Name.csv", encoding: "ISO-8859-1").each_line do |line|
  #splits the line at tab character into row Array
  row = line.chomp.split(" ").delete_if{|r| r.strip.empty?}     
  unless row[4].nil?
    puts row[4].split("&Wt.srch=1")[0]
  end
end

你设置它的方式是循环遍历线条,然后使用CSV.parse将线条分成单个字符串,因此行实际上是单个“单元格”而不是单元格数组。