我的文本文件如下:
员工详情.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
答案 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]+/, ","))}