如何使用Ruby将space-delimited .text文件转换为“,” - 分隔的.text文件?

时间:2013-01-27 21:43:37

标签: ruby

我的文本文件如下:

员工详情.txt

Raja Palit     77489  24   84   12/12/2011
Mathew bargur  77559  25   88   01/12/2011
harin Roy      77787  24   80   12/12/2012
Soumi paul      77251  24   88   11/11/2012

我想要的文件如下:

预期文件:

Raja,Palit,77489,24,84,12/12/2011
Mathew,bargur,77559,25,88,01/12/2011
harin,Roy,77787,24,80,12/12/2012
Soumi,paul,77251,24,88,11/11/2012

我在下面尝试过:

IO.foreach('D://docs//details.txt') do |line|
  splits = line.split("\t")

  col1, col2, col3, col4, col5, col6 = splits


  splits[6..-1].join(',')
end

4 个答案:

答案 0 :(得分:6)

虽然通过拆分空格来处理这类数据似乎是一种快速方法,但如果任何字段包含嵌入的空格,则会失败。例如,如果记录中人物的名称类似于“Maria Von Trapp”或“Smokey the Bear”,则生成的逗号分隔字段将是错误的。

处理此问题的正确方法是根据列字段宽度进行解析,然后在这些字段中挤压并去除空白,然后将记录转换为CSV记录。

require 'csv'
require 'scanf' if (RUBY_VERSION >= '1.9.3')

FORMAT = '%15c %d %d %d %10c'

data = <<EOT
Raja Palit      77489  24   84   12/12/2011
Mathew bargur   77559  25   88   01/12/2011
harin Roy       77787  24   80   12/12/2012
Soumi paul      77251  24   88   11/11/2012
Maria Von Trapp 99999  99   99   12/31/2012
Smokey the Bear 99999  99   99   12/31/2012
EOT

data.split("\n").each do |li|
  fields = li.scanf(FORMAT)
  puts [fields.first.strip, *fields[1 .. -1]].to_csv
end

哪个输出:

Raja Palit,77489,24,84,12/12/2011
Mathew bargur,77559,25,88,01/12/2011
harin Roy,77787,24,80,12/12/2012
Soumi paul,77251,24,88,11/11/2012
Maria Von Trapp,99999,99,99,12/31/2012
Smokey the Bear,99999,99,99,12/31/2012

注意,Ruby 1.9.3将scanf拆分为自己的模块,这解释了条件要求。

答案 1 :(得分:3)

字符串带有squeeze方法,它将参数中的char(s)运行压缩为一个char。在这种情况下,它将多个空格缩减为一个空格,然后用逗号代替:

File.open("test.txt") do |in_file|
  File.open("test.csv", 'w') do |out_file| #the 'w' opens the file for writing
    in_file.each {|line| out_file << line.squeeze(' ').gsub(' ', ',') }
  end # closes test.csv
end # closes test.txt

答案 2 :(得分:1)

您可以使用正则表达式用逗号替换任何空白字符:

my_string.sub! /\s/g, ','

如果要丢弃空字段,可以使用:

my_string.sub! /\s+/g, ','

另一种方法是将其拆分为空格并加入逗号。这也将丢弃空字段:

my_string = my_string.split(' ').join(',')

答案 3 :(得分:1)

File.open("details.txt", "r+"){|io| io.write(io.read.gsub(/[ \t]+/, ","))}