-1

我确实有一个如下的文本文件:

员工详情.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

4 回答 4

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
哈林罗伊,77787,24,80,12/12/2012
苏米保罗,77251,24,88,11/11/2012
玛丽亚·冯·特拉普,99999,99,99,12/31/2012
Smokey the Bear,99999,99,99,12/31/2012

注意,Ruby 1.9.3 分成scanf了自己的模块,它解释了条件要求。

于 2013-01-28T06:11:56.610 回答
3

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

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
于 2013-01-27T22:04:20.693 回答
1

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

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

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

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

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

my_string = my_string.split(' ').join(',')
于 2013-01-27T21:45:54.460 回答
1
File.open("details.txt", "r+"){|io| io.write(io.read.gsub(/[ \t]+/, ","))}
于 2013-01-27T21:54:53.080 回答