2013-01-27 2 views
-1

У меня есть текстовый файл, как показано ниже:Как преобразовать файл с разделителями в формате .txt в файл «,» - с разделителем .txt с использованием Ruby?

Сотрудник details.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 
+3

Пожалуйста, улучшите свой вопрос, разместив код [правильно отформатированный] (http://stackoverflow.com/editing-help), который вы применили к этой проблеме. Кроме того, пожалуйста, найдите время, чтобы поделиться теми шагами, которые вы предприняли до сих пор, чтобы исследовать или решать проблемы самостоятельно. –

ответ

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 
+1

Сигналы вниз показывают, что вы делаете что-то неправильно. – steenslag

+1

@ VMSlover, не просите голосов. Задавайте хорошие вопросы и дайте хорошие ответы. Если вы не можете делать эти вещи, тогда ожидайте, что получите. –

+0

'line.squeeze ('') .gsub ('', ',')' можно свести к 'line.gsub (/ + /, ',')'. –

1

Вы можете использовать регулярные выражения, чтобы заменить пробельные символы с запятой:

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

Если вы хотите отказаться от пустых полей, вы можете использовать это:

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

Альтернативой было бы разделить его на пробелы и присоединиться к запятым. Это также будет отбрасывать пустые поля:

my_string = my_string.split(' ').join(',') 
1
File.open("details.txt", "r+"){|io| io.write(io.read.gsub(/[ \t]+/, ","))} 
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 в свой собственный модуль, который объясняет условное требуется.

+0

OMG! Какое замечательное объяснение! Большое спасибо! –

Смежные вопросы