-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、2011/12/12
マシュー・バーガー,77559,25,88,01/12/2011
ハリン ロイ,77787,24,80,12/12/2012
スーミ ポール,77251,24,88,11/11/2012
マリア・フォン・トラップ,99999,99,99,12/31/2012
スモーキー・ザ・ベア、99999、99、99、2012/12/31

Ruby 1.9.3scanfは、条件付きの require を説明する独自のモジュールに分割されていることに注意してください。

于 2013-01-28T06:11:56.610 に答える
3

文字列にはメソッドが付属しておりsqueeze、引数内の文字の実行を1つの文字に絞り込みます。この場合、複数のスペースを1つのスペースに減らし、コンマに置き換えます。

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
File.open("details.txt", "r+"){|io| io.write(io.read.gsub(/[ \t]+/, ","))}
于 2013-01-27T21:54:53.080 に答える
1

正規表現を使用して、空白文字をコンマに置き換えることができます。

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

空のフィールドを破棄したい場合は、これを使用できます。

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

別の方法は、スペースで分割し、コンマで結合することです。これにより、空のフィールドも破棄されます。

my_string = my_string.split(' ').join(',')
于 2013-01-27T21:45:54.460 に答える